ffmpeg系列一:用ffmpeg将视频转成gif动图
ffmpeg系列一:用ffmpeg将视频转成gif动图
写博客,考虑经常要录屏制作gif动图,找了几个软件都不尽如人意,干脆直接上ffmpeg吧
1. 首先就是将一个视频直接转成gif动图,基本命令格式如下:
ffmpeg -i 你的视频文件.mp4 生成的文件名.gif
是不是相当简单。那么,如果说原始视频太长,你只想截取其中的一段视频生成gif,你可以增加-ss和-t两个参数,-ss代表的是start time,也就是开始时间,你可以指定开始的具体秒数,也可以用时:分:秒.毫秒的格式,比如00:12:14.500。-t是要截取的时长,单位是秒。假设我们想从input.mp4里的第73.5秒开始,截取12秒的视频内容生成动图,命令行你可以写成如下的方式:
ffmpeg -i input.mp4 -ss 73.5 -t 12 out.gif
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 out.gif
但是,当gif生成后,你会发现gif的大小非常大,这是因为你没有指定目标帧率和分辨率,ffmpeg会延用原始视频的相关参数,这时候可以考虑以下几种方式来降低生成gif动态的大小。
2. 降低动图的帧率
用-r参数来降低征率,比如原始的input.mp4是30帧的,可以用-r 15来降低成15帧。具体效果也是很明显的,生成的文件大小从原来的86MB下降到56MB,具体命令行如下:
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -r 15 out1.gif
关于ffmpeg的-r参数,有个很小坑,-r参数一定要放到-i参数后面,它在前在后的作用是不一样的。
3. 调整画面分辨率
比如原始视频是1080p的,我们可以将其减低到480p,从而显著降低最终的gif文件大小,这里可以使用-s参数,后面跟具体的分辨率大小比如480x272 具体命令如下:
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -s 480x272 out2.gif
4. 查看原始分辨率
有些时候,我们不知道原始的视频分辨率,如果贸然指定目标分辨率的话,可能会导致画面被拉伸,观感下降,这时候可以使用一个更高级的参数-vf,-vf其实就比较复杂了,这里我们只看如何用-vf参数实现宽高等比例缩放吧,具体命令如下:
#scale后面可以指定具体的分辨率宽:高,作用同-s,也可以只指定宽或者高,
#另一者用-d代替,ffmpeg就会自动缩放,保持原比例
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -vf "scale=480:-1" out3.gif
5. 同时降低帧率及分辨率
从原来的1080p降低到了480p后,文件大小变化更加明显,从原来的86MB降低到了6MB。看来还是将分辨率的效果比较明显,但是6MB作为表情包还是太大了,这时候我们可以将上面两种方式结合到一起,降分辨率的同时降帧率,命令行如下:
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -vf "scale=480:-1" -r 15 out4.gif
最后生成的文件只有4MB了。这里我再分享一个我做表情包的小技巧,就是提前用剪映剪好你想要的片段,也可以用剪映直接做好画面,导出时选择低分辨率和低码率,这样用最开始的命令直接生成的gif大小也是会在5MB内的,就省了调整各参数的时间了。