Node.js 通过ffmpeg处理视频

1,184 阅读2分钟

1. 几张图片合成gif

ffmpeg -r 1 -i ./video/shot-%d.jpg ./video/11.gif

2. 视频第二秒开始截取三秒转换gif

ffmpeg -t 3 -ss 00:00:02 -i small.mp4 small-clip.gif

3. 视频自动裁剪关键帧

什么是关键帧:

关键帧,是指动画中一个绘图,定义任何的起点和终点平滑过渡。一系列关键帧定义了观看者将看到的运动,而关键帧在电影,视频或动画上的位置定义了运动的时间。

详细解释: blog.csdn.net/justloveyou…

自动截取I帧:

ffmpeg -i assets/video2.mp4 -an -vf select='eq(pict_type\,I)' -vsync 2 -s 960x540 -f image2 assets/image-%03d.jpeg

各参数解释:
-i :输入文件,这里的话其实就是视频;
-vf:是一个命令行,表示过滤图形的描述。选择过滤器select会选择帧进行输出:pict_type和对应的类型:PICT_TYPE_I 表示是I帧,即关键帧;
-vsync 2:阻止每个关键帧产生多余的拷贝;
-f image2 name_%02d.jpeg:将视频帧写入到图片中,样式的格式一般是: “%d” 或者 “%0Nd”
-s:分辨率,544*960

这样保存下来的关键帧的命名顺序是从001开始的,数字表示第几个关键帧。

2.将图片序列合成视频

   ffmpeg -f image2 -i image%d.jpg video.mpg

上面的命令会把当前目录下的图片(名字如:image1.jpg, image2.jpg, 等...)合并成video.mpg

3.将视频分解成图片序列

   ffmpeg -i video.mpg image%d.jpg

上面的命令会生成image1.jpg, image2.jpg, ...
支持的图片格式有:PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI

4.从视频抽出声音,并存为Mp3

   ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3

说明:
* 源视频:source_video.avi
* 音频位率:192kb/s
* 输出格式:mp3
* 生成的声音:sound.mp3

引用:
ffmpeg 提取关键帧blog.csdn.net/u011394059/…
ffmpeg 常用命令blog.sina.com.cn/s/blog_6495…

4. 有效压缩gif以减小大小

ffmpeg -i input.mp4 -filter_complex "[0:v]fps=10,scale=-1:90:flags=lanczos,split [a][b];[a] palettegen [p];[b][p] paletteuse" -y output.gif 

function next(ctx) {  ctx.body = {    code: '200',    data: 'ok',  };  ffmpeg('123.mp4')    .complexFilter(['[0:v]fps=10,scale=-1:300:flags=lanczos,split [a][b];[a] palettegen [p];[b][p] paletteuse'])    .outputOptions(['-t 10', '-ss 00:00:02', '-r 8'])    // .filterGraph('setpts=0.4*PTS')    .on('start', (str) => { console.log('转换任务开始~', str); })    .on('progress', (progress) => { console.log(`进行中,完成${progress.frames}帧`); })    .on('end', (str) => {      console.log('转换任务完成!', str);    })    .save('./assets/small.gif');}

但是,我们发现创建的gif与使用次中音创建的gif在大小上存在巨大差异。

[原始MP4]-845KB

Tenor Nano gif - 42KB

ffmpeg gif - 106KB

我们甚至尝试更改抖动算法以进一步减小尺寸,但最终增加了噪声并损坏了gif品质。

paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle

我们也尝试过在Gifsicle中调整颜色量化,但这没有用

gifsicle --resize _x90 --colors 256 --color-method diversity --dither=ordered --resize-method sample input.gif > output.gif