官网
- 库:FFMPEG
- 播放器: VLC
添加依赖
代码语言:javascript复制npm install --save fluent-ffmpeg
或者添加
代码语言:javascript复制"dependencies": {
"fluent-ffmpeg": "^2.1.2"
}
之后
代码语言:javascript复制npm install
详解
创建FFmpeg命令
fluent FFmpeg返回一个构造函数,你可以使用它来对FFmpeg命令进行操作。
代码语言:javascript复制var FfmpegCommand = require('fluent-ffmpeg');
var command = new FfmpegCommand();
你还可以使用不带 new
运算符的构造函数。
var ffmpeg = require('fluent-ffmpeg');
var command = ffmpeg();
你可以将输入文件 NAME 或者可以读流。配置对象或者两者传递给构造函数。
代码语言:javascript复制var command = ffmpeg('/path/to/file.avi');
var command = ffmpeg(fs.createReadStream('/path/to/file.avi'));
var command = ffmpeg({
option: "value",
// ...
});
var command = ffmpeg('/path/to/file.avi', {
option: "value",
// ...
});
可以使用以下选项:
source
: 输入文件 NAME 或者可以读流( 如果传递到构造函数的输入文件被忽略)timeout
: ffmpeg超时秒( 默认为无超时)- ( 默认情况下,
preset
或者presets
: 从目录加载 MODULE 预设) - 在 Windows 和 20之间,
niceness
或者priority
: ffmpeg niceness值,在平台上忽略( 默认为4 ) logger
: 带有debug()
,info()
,warn()
和error()
方法的记录器对象( 默认为无日志记录)- 在内存中保存的ffmpeg/stderr的最大行数( 默认为,使用 0表示无限制存储)。
指定输入
你可以向Ffmpeg命令添加任意数量的输入。 输入可以是:
- 文件 NAME ( (
/path/to/file.avi
) ) ; - 一个图像 Pattern ( (
/path/to/framed.png
) ) - 可以读流;只有一个输入流可以用于命令,但可以同时使用输入流和一个或者多个文件名。
ffmpeg('/path/to/input1.avi')
.input('/path/to/input2.avi')
.input(fs.createReadStream('/path/to/input3.avi'));
ffmpeg()
.input('/path/to/input1.avi')
.input('/path/to/input2.avi');
ffmpeg()
.addInput('/path/to/framed.png')
.addInput('/path/to/soundtrack.mp3');
ffmpeg()
.mergeAdd('/path/to/input1.avi')
.mergeAdd('/path/to/input2.avi');
输入选项
以下方法允许将输入相关选项传递给 ffmpeg。 这些方法中的每一个都适用于最后一个输入的(。如果有的话,包括传递给构造函数的)。 在调用这些内容之前,必须添加输入,否则将引发错误。
inputFormat(format): 指定输入格式
这只对原始输入有用,因为ffmpeg可以自动确定输入格式。
代码语言:javascript复制ffmpeg()
.input('/dev/video0')
.inputFormat('mov')
.input('/path/to/file.avi')
.inputFormat('avi');
流畅的ffmpeg检查在实际运行该命令之前是否可用,并在指定的输入格式不可用时抛出错误。
inputFPS(fps): 指定输入帧数
这只对原始输入有效,因为ffmpeg可以自动确定输入帧数。
代码语言:javascript复制ffmpeg('/dev/video0').inputFPS(29.7);
native(): 读取本机帧的输入
代码语言:javascript复制ffmpeg('/path/to/file.avi').native();
seekInput(time): 设置输入开始时间
查找输入,仅在给定时间偏移时开始解码。 time
参数可以是数字( 以秒为单位),也可以是时间戳字符串( 格式为 [[hh:]mm:]ss[.xxx]
)。
ffmpeg('/path/to/file.avi').seekInput(134.5);
ffmpeg('/path/to/file.avi').seekInput('2:14.500');
循环( [duration] ): 循环输入
代码语言:javascript复制ffmpeg('/path/to/file.avi').loop();
ffmpeg('/path/to/file.avi').loop(134.5);
ffmpeg('/path/to/file.avi').loop('2:14.500');
inputOptions(option…): 添加自定义输入选项
这里方法允许将任何输入相关的选项传递给 ffmpeg。 可以使用单个参数调用它,以传递单个选项,也可以使用空格分隔参数:
代码语言:javascript复制/* Single option */
ffmpeg('/path/to/file.avi').inputOptions('-someOption');
/* Single option with parameter */
ffmpeg('/dev/video0').inputOptions('-r 24');
你还可以通过将 array 传递给方法来一次传递多个选项:
代码语言:javascript复制ffmpeg('/path/to/file.avi').inputOptions([
'-option1',
'-option2 param2',
'-option3',
'-option4 param4'
]);
最后,你还可以将 命令行 标记作为单独的参数传递给方法:
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.inputOptions(
'-option1',
'-option2', 'param2',
'-option3',
'-option4', 'param4'
);
音频选项
以下方法更改输出输出中的音频流。
noAudio(): 完全禁用音频
在输出中禁用音频,并删除以前设置的音频选项。
代码语言:javascript复制ffmpeg('/path/to/file.avi').noAudio();
audioCodec(codec): 设置音频编解码器
代码语言:javascript复制ffmpeg('/path/to/file.avi').audioCodec('libmp3lame');
流畅的ffmpeg检查在实际运行该命令之前是否可用,并在指定的音频编解码器不可用时抛出错误。
audioBitrate(bitrate): 设置音频比特率
将音频比特率设置为 kbps。 bitrate
参数可以是一个数字或者带有可选 k
后缀的字符串。 这里方法用于强制固定比特率;使用 audioQuality()
可以使用可变比特率进行编码。
ffmpeg('/path/to/file.avi').audioBitrate(128);
ffmpeg('/path/to/file.avi').audioBitrate('128');
ffmpeg('/path/to/file.avi').audioBitrate('128k');
audioChannels(count): 设置音频通道计数
代码语言:javascript复制ffmpeg('/path/to/file.avi').audioChannels(2);
audioFrequency(freq): 设置音频频率
freq
参数指定音频频率,单位为 Hz。
ffmpeg('/path/to/file.avi').audioFrequency(22050);
audioQuality(quality): 设置音频质量
这里方法为音频编解码器( VBR编码) 修正了一个品质因素。 质量比例取决于实际使用的编解码器。
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.audioCodec('libmp3lame')
.audioQuality(0);
audioFilters(filter…): 添加自定义音频过滤器
这里方法允许添加自定义音频筛选器。 你可以通过传递多个参数或者 array 一次添加多个筛选器。 有关可用过滤器及其语法,请参阅Ffmpeg文档。
每个筛选器pased都可以是一个筛选器字符串( 例如。 volume=0.5
) 或者带有以下键的过滤器规范对象:
filter
: 筛选器名称options
: 可选,可以是过滤器的选项字符串( 例如。n=-50dB:d=5
),用于未命名选项的选项 array ( 例如。['-50dB', 5]
) 或者对象映射选项名( 例如。{ n: '-50dB', d: 5 }
)。 如果未指定options
,将在没有任何选项的情况下添加筛选器。
ffmpeg('/path/to/file.avi')
.audioFilters('volume=0.5')
.audioFilters('silencedetect=n=-50dB:d=5');
ffmpeg('/path/to/file.avi')
.audioFilters('volume=0.5', 'silencedetect=n=-50dB:d=5');
ffmpeg('/path/to/file.avi')
.audioFilters(['volume=0.5', 'silencedetect=n=-50dB:d=5']);
ffmpeg('/path/to/file.avi')
.audioFilters([{
filter: 'volume',
options: '0.5'
},
{
filter: 'silencedetect',
options: 'n=-50dB:d=5'
}
]);
ffmpeg('/path/to/file.avi')
.audioFilters([{
filter: 'volume',
options: ['0.5']
}, {
filter: 'silencedetect',
options: {
n: '-50dB',
d: 5
}
}]);
视频选项
以下方法将更改所生成输出中的视频流。
noVideo(): 完全禁用视频
这里方法禁用视频输出,并删除以前设置的视频选项。
代码语言:javascript复制ffmpeg('/path/to/file.avi').noVideo();
videoCodec(codec): 设置视频编解码器
代码语言:javascript复制ffmpeg('/path/to/file.avi').videoCodec('libx264');
流畅的ffmpeg检查在实际运行该命令之前是否可用,并在指定的视频编解码器不可用时抛出错误。
videoBitrate ( 比特率 [, constant=false] ): 设置视频比特率
将目标视频比特率设置为 kbps。 bitrate
参数可以是一个数字或者带有可选 k
后缀的字符串。 constant
参数指定是否应该在( 默认为 false ) 中执行固定比特率。
请记住,根据使用的编解码器,强制一定的比特率经常成为质量的成本。 在不损失太多质量的情况下,拥有固定视频比特率的最佳方法是使用 2-pass 编码( 请参阅Fffmpeg文档)。
代码语言:javascript复制ffmpeg('/path/to/file.avi').videoBitrate(1000);
ffmpeg('/path/to/file.avi').videoBitrate('1000');
ffmpeg('/path/to/file.avi').videoBitrate('1000k');
ffmpeg('/path/to/file.avi').videoBitrate('1000k', true);
videoFilters(filter…): 添加自定义视频过滤器
这里方法允许添加自定义视频筛选器。 你可以通过传递多个参数或者 array 一次添加多个筛选器。 有关可用过滤器及其语法,请参阅Ffmpeg文档。
每个筛选器pased都可以是一个筛选器字符串( 例如。 fade=in:0:30
) 或者带有以下键的过滤器规范对象:
filter
: 筛选器名称options
: 可选,可以是过滤器的选项字符串( 例如。in:0:30
),用于未命名选项的选项 array ( 例如。['in', 0, 30]
) 或者对象映射选项名( 例如。{ t: 'in', s: 0, n: 30 }
)。如果未指定options
,将在没有任何选项的情况下添加筛选器。
ffmpeg('/path/to/file.avi')
.videoFilters('fade=in:0:30')
.videoFilters('pad=640:480:0:40:violet');
ffmpeg('/path/to/file.avi')
.videoFilters('fade=in:0:30', 'pad=640:480:0:40:violet');
ffmpeg('/path/to/file.avi')
.videoFilters(['fade=in:0:30', 'pad=640:480:0:40:violet']);
ffmpeg('/path/to/file.avi')
.videoFilters([{
filter: 'fade',
options: 'in:0:30'
},
{
filter: 'pad',
options: '640:480:0:40:violet'
}
]);
ffmpeg('/path/to/file.avi')
.videoFilters({
filter: 'fade',
options: ['in', 0, 30]
}, {
filter: 'filter2',
options: {
w: 640,
h: 480,
x: 0,
y: 40,
color: 'violet'
}
});
fps(fps): 设置输出帧数
代码语言:javascript复制ffmpeg('/path/to/file.avi').fps(29.7);
frames(count): 指定帧计数
将ffmpeg设置为只编码一定数量的帧。
代码语言:javascript复制ffmpeg('/path/to/file.avi').frames(240);
视频帧大小选项
以下方法可以调整输出视频帧大小的大小。 它们一起工作,生成合适的视频过滤器。
size(size): 设置输出帧大小
这里方法设置输出帧大小。 size
参数可能具有以下格式之一:
640x480
: 设置固定输出帧大小。 否则,除非调用autopad()
,否则会导致视频被拉伸或者压缩以适应请求的大小。640x?
: 自动设置固定宽度和计算高度。 如果同时调用aspect()
,则用于计算视频高度;否则,将计算它以使输入纵横比保持不变。?x480
: 自动设置高度和计算宽度。 如果同时调用aspect()
,则用于计算视频宽度,否则将计算它以使输入纵横比保持不变。50%
: 将宽度和高度重缩放为给定百分比。 始终保留纵横比。
注意,为了与某些编解码器兼容,计算的维度总是四舍五入到 2的倍数。
代码语言:javascript复制ffmpeg('/path/to/file.avi').size('640x480');
ffmpeg('/path/to/file.avi').size('640x?');
ffmpeg('/path/to/file.avi').size('640x?').aspect('4:3');
ffmpeg('/path/to/file.avi').size('50%');
aspect(aspect): 设置输出帧纵横比
这里方法强制指定输出纵横比。 aspect
参数可以是数字,也可以是 X:Y
字符串。
注意,当使用固定宽度和高度或者百分比调用 aspect()
时,如果没有调用,则调用将被忽略。
ffmpeg('/path/to/file.avi').size('640x?').aspect('4:3');
ffmpeg('/path/to/file.avi').size('640x?').aspect(1.33333);
autopad ( [color=’black’] ): 启用自动填充输出视频
这里方法允许将自动填充应用到输出视频。 color
参数指定用于 padding的颜色,并且必须是由 ffmpeg ( 默认为’黑色’) 支持的颜色代码或者 NAME。
这里方法的行为取决于对其他视频大小方法所做的调用:
- 当使用百分比调用
size()
或者还没有调用时,将忽略它; - 使用
WxH
调用size()
时,它添加 padding,以便保留输入纵横比; - 当使用
Wx?
或者?xH
调用size()
时,只有在aspect()
被称为(。否则,输出维度将从输入纵横比计算,而不需要 padding ) 时才添加 padding。
// No size specified, autopad() is ignored
ffmpeg('/path/to/file.avi').autopad();
// Adds padding to keep original aspect ratio.
// - with a 640x400 input, 40 pixels of padding are added on both sides
// - with a 600x480 input, 20 pixels of padding are added on top and bottom
// - with a 320x200 input, video is scaled up to 640x400 and 40px of padding
// is added on both sides
// - with a 320x240 input, video is scaled up to 640x480 and and no padding
// is needed
ffmpeg('/path/to/file.avi').size('640x480').autopad();
ffmpeg('/path/to/file.avi').size('640x480').autopad('white');
ffmpeg('/path/to/file.avi').size('640x480').autopad('#35A5FF');
// Size computed from input, autopad() is ignored
ffmpeg('/path/to/file.avi').size('50%').autopad();
ffmpeg('/path/to/file.avi').size('640x?').autopad();
ffmpeg('/path/to/file.avi').size('?x480').autopad();
// Calling. size('640x?').aspect('4:3') is similar to calling. size('640x480')
// - with a 640x400 input, 40 pixels of padding are added on both sides
// - with a 600x480 input, 20 pixels of padding are added on top and bottom
// - with a 320x200 input, video is scaled up to 640x400 and 40px of padding
// is added on both sides
// - with a 320x240 input, video is scaled up to 640x480 and and no padding
// is needed
ffmpeg('/path/to/file.avi').size('640x?').aspect('4:3').autopad();
ffmpeg('/path/to/file.avi').size('640x?').aspect('4:3').autopad('white');
ffmpeg('/path/to/file.avi').size('640x?').aspect('4:3').autopad('#35A5FF');
// Calling. size('?x480').aspect('4:3') is similar to calling. size('640x480')
ffmpeg('/path/to/file.avi').size('?x480').aspect('4:3').autopad();
ffmpeg('/path/to/file.avi').size('?x480').aspect('4:3').autopad('white');
ffmpeg('/path/to/file.avi').size('?x480').aspect('4:3').autopad('#35A5FF');
为了与前面的fluent-ffmpeg版本兼容,该方法还接受一个附加布尔参数,该参数指定是否应用自动填充。
代码语言:javascript复制ffmpeg('/path/to/file.avi').size('640x480').autopad(true);
ffmpeg('/path/to/file.avi').size('640x480').autopad(true, 'pink');
keepDAR(): 力保持显示纵横比
当将非正方形像素转换为不支持非平方像素的输出格式时,这里方法非常有用( 例如。 大多数图像格式。它重新调整输入以使显示宽度比相同。
代码语言:javascript复制ffmpeg('/path/to/file.avi').keepDAR();
指定多个输出
输出( 目标 [, options] ): 向命令中添加输出
向命令中添加输出。 target
参数可以是输出文件名,也可以是可以写流( 但是至多一个输出流可以与单个命令一起使用)。
当 target
为流时,可能会传递其他 options
对象。 如果存在,则将通过ffmpeg输出流 pipe()
方法。
添加输出将切换命令的”当前输出”,所以应用于输出的任何exchangeactivesync方法确实应用于最后添加的输出。 为了向后兼容,你还可以在添加第一个输出之前调用这些方法( )。 适用于输出的方法都是non-input-related方法,除了 complexFilter()
之外,它是全局的。
还要注意,在调用 output()
时,不应该使用 save()
或者 stream()
(。以前 saveToFile()
和 writeToStream()
) 方法,因为它们已经添加了。 使用 run()
方法开始处理。
var stream = fs.createWriteStream('outputfile.divx');
ffmpeg('/path/to/file.avi')
.output('outputfile.mp4')
.output(stream);
ffmpeg('/path/to/file.avi')
// You may pass a pipe() options object when using a stream. output(stream, { end:true });
// Output-related methods apply to the last output added
ffmpeg('/path/to/file.avi')
.output('outputfile.mp4')
.audioCodec('libfaac')
.videoCodec('libx264')
.size('320x200')
.output(stream)
.preset('divx')
.size('640x480');
// Use the run() method to run commands with multiple outputs
ffmpeg('/path/to/file.avi')
.output('outputfile.mp4')
.output(stream)
.on('end', function () {
console.log('Finished processing');
})
.run();
输出选项
duration(time): 设置输出持续时间
强制ffmpeg在特定的输出持续时间后停止转码。 time
参数可以是数字( 以秒为单位),也可以是时间戳字符串( 格式为 [[hh:]mm:]ss[.xxx]
)。
ffmpeg('/path/to/file.avi').duration(134.5);
ffmpeg('/path/to/file.avi').duration('2:14.500');
seek(time): 查找输出
在将流编码到输出之前查找流。 这与调用 seekInput()
不同,因为偏移量只适用于一个输出。 这也会更慢,因为跳过的帧仍将被解码为( 但除去)。
time
参数可以是数字( 以秒为单位),也可以是时间戳字符串( 格式为 [[hh:]mm:]ss[.xxx]
)。
ffmpeg('/path/to/file.avi')
.seekInput('1:00')
.output('from-1m30s.avi')
.seek(30)
.output('from-1m40s.avi')
.seek('0:40');
format(format): 设置输出格式
代码语言:javascript复制ffmpeg('/path/to/file.avi').format('flv');
flvmeta(): 在转码后更新FLV元数据
调用这里方法可以在输出文件上运行 flvmeta
或者 flvtool2
,以添加元数据并制作文件流。 输出到流时不起作用,仅在输出为FLV格式时才有用。
ffmpeg('/path/to/file.avi').flvmeta().format('flv');
outputOptions(option…): 添加自定义输出选项
这里方法允许将任何输出相关的选项传递给 ffmpeg。 可以使用单个参数调用它,以传递单个选项,也可以使用空格分隔参数:
代码语言:javascript复制/* Single option */
ffmpeg('/path/to/file.avi').outputOptions('-someOption');
/* Single option with parameter */
ffmpeg('/dev/video0').outputOptions('-r 24');
你还可以通过将 array 传递给方法来一次传递多个选项:
代码语言:javascript复制ffmpeg('/path/to/file.avi').outputOptions([
'-option1',
'-option2 param2',
'-option3',
'-option4 param4'
]);
最后,你还可以将 命令行 标记作为单独的参数传递给方法:
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.outputOptions(
'-option1',
'-option2', 'param2',
'-option3',
'-option4', 'param4'
);
杂项选项
preset(preset): 使用 fluent-ffmpeg预设
有两种类型的预设支持流畅的ffmpeg。 第一个是预设模块;要使用这些模块,请将预设的NAME 作为 preset
参数传递。 预设模块从 presets
构造函数选项( 默认为 lib/presets
fluent ffmpeg子目录) 指定的目录加载。
// Uses <path-to-fluent-ffmpeg>/lib/presets/divx.js
ffmpeg('/path/to/file.avi').preset('divx');
// Uses/my/presets/foo.js
ffmpeg('/path/to/file.avi', {
presets: '/my/presets'
}).preset('foo');
预设模块必须导出 load()
函数,该函数接受FfmpegCommand作为参数。 流畅的ffmpeg附带了预先设定好的预设模块:
divx
flashvideo
podcast
下面是包含在 divx
预设中的代码示例:
exports.load = function (ffmpeg) {
ffmpeg
.format('avi')
.videoBitrate('1024k')
.videoCodec('mpeg4')
.size('720x?')
.audioBitrate('128k')
.audioChannels(2)
.audioCodec('libmp3lame')
.outputOptions(['-vtag DIVX']);
};
第二种预设是预置函数。 使用FfmpegCommand作为参数传递一个函数。
代码语言:javascript复制function myPreset(command) {
command.format('avi').size('720x?');
}
ffmpeg('/path/to/file.avi').preset(myPreset);
complexFilter ( 过滤器 [, map] ): 设置复杂 filtergraph
complexFilter()
方法允许为命令设置复杂的filtergraph。 它需要一个过滤器规范( 或者过滤器规格 array ) 和一个可选的输出映射参数作为参数。
过滤规范可以是普通的ffmpeg筛选器字符串( 例如。 split=3[a][b][c]
) 或者具有以下键的对象:
filter
: 筛选器名称options
: 可选,可以是过滤器的选项字符串( 例如。in:0:30
),用于未命名选项的选项 array ( 例如。['in', 0, 30]
) 或者对象映射选项名( 例如。{ t: 'in', s: 0, n: 30 }
)。如果未指定options
,将在没有任何选项的情况下添加筛选器。inputs
: 可选,过滤器的输入流说明符。 值可以是单个流说明符字符串,也可以是流说明符的array。 每个说明符可以选择用方括号括起来。 如果没有指定输入流,ffmpeg将使用正确类型的第一个未使用流。outputs
: 可选;过滤器的输出流说明符。 值可以是单个流说明符字符串,也可以是流说明符的array。 每个说明符可以选择用方括号括起来。
输出映射参数指定要包含在filtergraph的输出中的流。 它可以是单个流说明符字符串,也可以是流说明符的array。 每个说明符可以选择用方括号括起来。 当该参数不存在时,ffmpeg将默认将所有未使用的输出保存到输出文件。
请注意,在给定命令上只能设置一个复杂的filtergraph。 再次调用 complexFilter()
将覆盖以前设置的filtergraph,但是你可以在单个调用中设置任意数量的过滤器。
ffmpeg('/path/to/file.avi')
.complexFilter([
// Rescale input stream into stream 'rescaled''scale=640:480[rescaled]',
// Duplicate rescaled stream 3 times into streams a, b, and c
{
filter: 'split',
options: '3',
inputs: 'rescaled',
outputs: ['a', 'b', 'c']
},
// Create stream 'red' by removing green and blue channels from stream 'a'
{
filter: 'lutrgb',
options: {
g: 0,
b: 0
},
inputs: 'a',
outputs: 'red'
},
// Create stream 'green' by removing red and blue channels from stream 'b'
{
filter: 'lutrgb',
options: {
r: 0,
b: 0
},
inputs: 'b',
outputs: 'green'
},
// Create stream 'blue' by removing red and green channels from stream 'c'
{
filter: 'lutrgb',
options: {
r: 0,
g: 0
},
inputs: 'c',
outputs: 'blue'
},
// Pad stream 'red' to 3x width, keeping the video on the left,
// and name output 'padded'
{
filter: 'pad',
options: {
w: 'iw*3',
h: 'ih'
},
inputs: 'red',
outputs: 'padded'
},
// Overlay 'green' onto 'padded', moving it to the center,
// and name output 'redgreen'
{
filter: 'overlay',
options: {
x: 'w',
y: 0
},
inputs: ['padded', 'green'],
outputs: 'redgreen'
},
// Overlay 'blue' onto 'redgreen', moving it to the right
{
filter: 'overlay',
options: {
x: '2*w',
y: 0
},
inputs: ['redgreen', 'blue'],
outputs: 'output'
},
], 'output');
设置事件处理程序
在实际运行命令之前,你可能希望设置事件侦听器,以便在完成任务时通知它。 以下事件可用:
‘开始’: ffmpeg进程已经启动
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.on('start', function (commandLine) {
console.log('Spawned Ffmpeg with command: ' commandLine);
});
‘codecdata’: 输入编解码器数据
format
: 输入格式duration
: 输入持续时间audio
: 音频编解码器audio_details
: 音频编码详细信息video
: 视频编解码器video_details
: 视频编码详细信息
ffmpeg('/path/to/file.avi')
.on('codecData', function (data) {
console.log('Input is ' data.audio ' audio ' 'with ' data.video ' video');
});
‘进度’: 转码过程信息
frames
: 处理的帧总数currentFps
: FFmpeg当前正在处理的帧数currentKbps
: FFmpeg当前正在处理的吞吐量targetSize
: 目标文件的当前大小以kb为单位timemark
: 当前帧的时间戳秒percent
: 对进度百分比的估计
注意,percent
可以能是( 非常) 不准确的,因为只有进入of的进度信息才是写入( 以及相应的持续时间)的帧数。 为了估计百分比,必须猜测总输出持续时间,并使用添加到命令中的第一个输入。 特别是:
- 在使用输入流时,百分比不可用
- 在使用不同持续时间的多个输入时,百分比可能是错误的,而第一个则不是最长
ffmpeg('/path/to/file.avi')
.on('progress', function (progress) {
console.log('Processing: ' progress.percent '% done');
});
‘stderr’: FFmpeg输出
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.on('stderr', function (stderrLine) {
console.log('Stderr output: ' stderrLine);
});
‘错误’: 转码错误
如果流用于输入或者输出,那么这些流发出的任何错误都将通过 error
作为 inputStreamError
和 outputStreamError
分别传递。
向控制台发出警告:如果未发出任何侦听器,则将该错误输出到控制台,并终止程序,从而将 error
事件的处理程序设置为默认的。
ffmpeg('/path/to/file.avi')
.on('error', function (err, stdout, stderr) {
console.log('Cannot process video: ' err.message);
});
‘结尾’: 处理完成
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.on('end', function (stdout, stderr) {
console.log('Transcoding succeeded!');
});
当命令输出到流时,stdout
为空。 stdout
和 stderr
都受 stdoutLines
选项( 默认为 100行)的限制。
FFmpeg处理
save(filename): 将输出保存到文件
启动ffmpeg处理并将输出保存到文件。
代码语言:javascript复制ffmpeg('/path/to/file.avi')
.videoCodec('libx264')
.audioCodec('libmp3lame')
.size('320x240')
.on('error', function (err) {
console.log('An error occurred: ' err.message);
})
.on('end', function () {
console.log('Processing finished!');
})
.save('/path/to/output.mp4');
注意:save()
方法实际上是用来调用 output()
和 run()
的语法糖。
管道( [stream],[options] ): 将输出输出到可以写流
开始处理和管道ffmpeg输出到可以写流。 如果存在 options
参数,则将它的传递给流方法( 请参阅nodejs文档)的ffmpeg输出 pipe()
。
var outStream = fs.createWriteStream('/path/to/output.mp4');
ffmpeg('/path/to/file.avi')
.videoCodec('libx264')
.audioCodec('libmp3lame')
.size('320x240')
.on('error', function (err) {
console.log('An error occurred: ' err.message);
})
.on('end', function () {
console.log('Processing finished!');
})
.pipe(outStream, {
end: true
});
如果没有 stream
参数,pipe()
方法返回一个PassThrough流,你可以将它管道到其他的( 或者只听事件)。
注释: 这只对 node> = 0.10有效。
代码语言:javascript复制var command = ffmpeg('/path/to/file.avi')
.videoCodec('libx264')
.audioCodec('libmp3lame')
.size('320x240')
.on('error', function (err) {
console.log('An error occurred: ' err.message);
})
.on('end', function () {
console.log('Processing finished!');
});
var ffstream = command.pipe();
ffstream.on('data', function (chunk) {
console.log('ffmpeg just wrote ' chunk.length ' bytes');
});
注意:stream()
方法实际上是用来调用 output()
和 run()
的语法糖。
run(): 开始处理
这里方法在生成多个输出( 否则,save()
或者 stream()
方法更直接) 时主要有用。 它以指定的输出开始处理。
警告: 调用其他处理方法时不要使用 run()
( 例如。 save()
,pipe()
或者 screenshots()
)。
ffmpeg('/path/to/file.avi')
.output('screenshot.png')
.noAudio()
.seek('3:00')
.output('small.avi')
.audioCodec('copy')
.size('320x200')
.output('big.avi')
.audioCodec('copy')
.size('640x480')
.on('error', function (err) {
console.log('An error occurred: ' err.message);
})
.on('end', function () {
console.log('Processing finished!');
})
.run();
mergeToFile ( 文件名,tmpdir ): 连接多个输入
代码语言:javascript复制ffmpeg('/path/to/part1.avi')
.input('/path/to/part2.avi')
.input('/path/to/part2.avi')
.on('error', function (err) {
console.log('An error occurred: ' err.message);
})
.on('end', function () {
console.log('Merging finished!');
})
.mergeToFile('/path/to/merged.avi', '/path/to/tempDir');
屏幕截图( 选项 [, dirname] ): 生成缩略图
使用 screenshots
方法提取一个或者多个缩略图,并将它们保存为PNG文件。 但是,对于这里实现,有一些注意事项:
- 它在输入流上不起作用。
progress
事件报告的进度信息不准确。- 它的过滤效果不好。 特别是,不要使用
size()
方法调整缩略图大小,而使用size
选项。
options
参数是具有以下键的对象:
folder
: 生成的图像文件的输出文件夹。 默认为当前文件夹。filename
: 输出文件名 Pattern ( 请参见下面)。 默认为” tn.png”。count
: 指定要生成的缩略图数。 使用这里选项时,将在视频( 例如当请求 3个缩略图时,在 25%。50%和视频长度的75% ) 中定期生成缩略图。 指定timemarks
或者timestamps
时,count
被忽略。timemarks
或者timestamps
: 指定视频中的时间戳的array,缩略图应在其中执行。 每个时间戳可以是一个数字( 以秒为单位),一个百分比字符串( 例如。 “50%”) 或者时间戳字符串,格式为”。hh: mm: ss”( 时间。分钟和毫秒都可选)。size
: 指定缩略图( 使用与.size()
方法相同的格式)的目标大小。 注意:在生成缩略图时不应该使用.size()
方法。
filename
选项为生成的文件指定文件名 Pattern。 它可能包含以下格式标记:
- ‘%s’: 在秒内偏移
- ‘%w’: 屏幕截图宽度
- ‘%h’: 屏幕截图高度
- ‘%r’: 屏幕截图分辨率( 同’%wx%h )
- ‘%f’: 输入文件名
- ‘%b’: 输入 basename ( 文件名为w/o 扩展)
- “%i”:timemark array 截图索引( 可以通过使用