如何通过ffmpeg将40秒15M的视频转换为8秒400K的GIF

2023-07-25 22:09:03

我录制了一个如何在头部玩家中使用chatgpt的40秒的视频,文件大小15M,1280x720,30fps,希望将视频转换成8~10秒的GIF。

1、初步达成

问chatgpt如何使用ffmpeg将视频转化为GIF,现在可以不先问百度也不问google了:

image.png

然后我通过下面的命令将这个视频转化为gif:

ffmpeg -i chatgpt_demo.mkv chatgpt_demo.gif

此时生成的chatgpt_demo.gif 是3.4M,除去文件还有点大的因素,这个gif播放一次的时间还是40秒的样子,做成gif来演示,目的就是希望它能用8~10秒的时间就播放完一次。

2、fps不能快放和慢放

ChatGPT建议增加参数-r试试,-r 0.2 表示每5秒一帧

ffmpeg -i chatgpt_demo.mkv -r 0.2 chatgpt_demo-r0.2.gif

生成的文件大小为419K。

下面的fps参数也有同样的功能,效果更好一点,生成的文件更小一点

ffmpeg -i chatgpt_demo.mkv -vf "fps=0.2" chatgpt_demo-fsp0.2.gif

生成的文件大小为311K。

但是通过设置帧数生成的gif,虽然文件大小是瘦身很大了,但是播放1次的时间还是40秒。

看来直接生成gif是不会有快放和慢放的效果的,只能通过其他方式来解决了。

3、先生成快播视频,再生成gif

这时,想到可以通过先生成快播的视频,然后再生成gif就可以达到目的了。

1)下面的命令生成5倍速播放的视频

ffmpeg -i chatgpt_demo.mkv -filter:v "setpts=0.2*PTS" chatgpt_demo-pts0.2.mkv

生成的视频总长度还是40秒,但是播放时发现其实在8秒左右已经播放完成,后面基本是保持静止帧不动了。

2)接下来就是把生成视频的前8秒生成GIF即可

ffmpeg -i chatgpt_demo-pts0.2.mkv -t 8 chatgpt_demo-fsp0.2-t8.gif

4、继续瘦身

此时生成的gif还有1.47M,继续通过设置fps=3参数来瘦身

ffmpeg -i chatgpt_demo-pts0.2.mkv -vf "fps=3" -t 8 chatgpt_demo-fsp0.2-t8.gif

瘦身后文件大小变为422K

如果要继续瘦身,可以继续减小fps,或者减小分辨率的方式

ffmpeg -i chatgpt_demo-pts0.2.mkv -vf "fps=3,scale=1024:-1:flags=lanczos" -t 8 chatgpt_demo-fsp0.2-t8.gif

5、无用的尝试

此时我问chatgpt能否将2条命令合成1条命令来完成,它给出了答案,这条命令可以执行,但是生成的gif播放一遍还是40秒。

image.png