使用ffmpeg命令为视频生成gif动态图片
系统设置2021-01-20本文二维码
ffmpeg工具能很好的帮我们处理视频音频,本文将介绍利用ffmpeg将视频或者视频的某一段转换成gif动态图片的简单方法,如果你正在使用ffmpeg,基本就不需要额外的第三方工具了。
如有必要可能需要使用引号将文件名或路径包含起来。
设置时间
通常我们只需要转换视频的某一个时间片段,所以不能像上图中的命令那样直接转换,需要使用-ss(设置起始时间),-t(设置持续时间)。
ffmpeg -ss 起始时间 -t 持续时间 -i 输入文件 输出文件
比如ffmpeg -ss 9 -t 5 -i 1.mp4 1.gif,将会从视频的9秒开始截取5秒片段转换为gif图片。-ss也可以设置为00:00:00.000的形式,为小时、分钟、秒、毫秒,例如00:00:09.000。
设置循环次数
-loop 循环次数,比如设置-loop 1,生成的gif图片将只会播放一次,0为无限次(默认)。
ffmpeg -ss 起始时间 -t 持续时间 -i 输入文件 -loop 循环次数 输出文件
比如ffmpeg -ss 9 -t 5 -i 1.mp4 -loop 0 1.gif。
设置缩放
如果是高分辨率视频,可能需要将画面缩放,不然gif图片就太大了,可以使用scale控制。比如scale=iw/2:-1:flags=lanczos(lanczos为缩放算法),将会设置gif图片的宽度为源视频一半,高度为比例缩放,也可以强制设置宽高像素。
ffmpeg -ss 起始时间 -t 持续时间 -i 输入文件 -loop 循环次数 -vf scale=宽:高:flags=lanczos 输出文件
例如ffmpeg -ss 9 -t 5 -i 1.mp4 -loop 0 -vf scale=iw/2:-1:flags=lanczos 1.gif。
设置fps(每秒帧数)
设置低一些的fps可以压缩gif的体积,使用fps=指定的fps数值,保持流畅即可。
ffmpeg -ss 起始时间 -t 持续时间 -i 输入文件 -loop 循环次数 -vf "scale=宽:高:flags=lanczos,fps=数值" 输出文件
例如ffmpeg -ss 9 -t 5 -i 1.mp4 -loop 0 -vf "scale=iw/2:-1:flags=lanczos,fps=15" 1.gif
裁剪画面
可能我们只需要将视频画面的一部分转成gif图片,可以使用crop,具体为crop=宽度:高度:宽度起始:高度起始,比如crop=200:200:0:0,将会从横向0像素,纵向0像素开始,从画面裁剪200x200的区域。
ffmpeg -ss 起始时间 -t 持续时间 -i 输入文件 -loop 循环次数 -vf "scale=宽:高:flags=lanczos,fps=数值,crop=宽度:高度:宽度起始:高度起始" 输出文件
例如ffmpeg -ss 9 -t 5 -i 1.mp4 -loop 0 -vf "scale=iw/2:-1:flags=lanczos,fps=15,crop=iw/2:ih:0:0" 1.gif,将裁剪视频的左半边画面。
提高gif画面质量
你可能发现通过上面的方法直接生成的gif图片质量不怎么好,可以使用split和palette过滤器进行改善。
ffmpeg -ss 起始时间 -t 持续时间 -i 输入文件 -loop 循环次数 -vf "scale=宽:高:flags=lanczos,fps=数值,crop=宽度:高度:宽度起始:高度起始,split[s1][s2];[s1]palettegen[p];[s2][p]paletteuse" 输出文件
如ffmpeg -ss 9 -t 5 -i 1.mp4 -loop 0 -vf "scale=iw/2:-1:flags=lanczos,fps=15,crop=iw/2:ih:0:0,split[s1][s2];[s1]palettegen[p];[s2][p]paletteuse" 1.gif。
上面的参数和过滤器可根据自己的需要自由选择及设置。
更多了解:http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html。
palettegen和paletteuse相关选项:https://ffmpeg.org/ffmpeg-filters.html#palettegen-1。