使用 FFMPEG 减少生成的 GIF 大小

ars*_*ena 18 video gif ffmpeg conversion

我正在开发将mp4文件转换为gifsusing 的android 应用程序ffmpeg。问题是生成的 gif 尺寸很大。另一个问题是,我不能使用其他任何东西ffmpeg(例如imagemagickfor convert,甚至palletes现在)来减少生成的 gif 大小。

这是我正在使用的命令: ffmpeg -y -i file.mp4 -pix_fmt rgb24 -r 10 -s 320x480 file.gif

那么有没有其他方法可以优化转换?

小智 25

下面的命令帮助我优化了我的 gif。这些参数可以根据您的具体要求进行更改。

ffmpeg -y -i input.mp4 -filter_complex "fps=5,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 这里的scalemax_colors极大地影响了输出gif的文件大小。

  • 如果您为 scale 和 max_colors 设置较低的值,则将抖动设置 为bayer会使输出 gif 看起来更好一些。抖动的默认值为sierra2_4a


Gya*_*yan 14

将 ffmpeg 用于 GIF 的标准方法是

从视频生成调色板

ffmpeg -y -i file.mp4 -vf palettegen palette.png
Run Code Online (Sandbox Code Playgroud)

然后,

ffmpeg -y -i file.mp4 -i palette.png -filter_complex paletteuse -r 10 -s 320x480 file.gif
Run Code Online (Sandbox Code Playgroud)

此处记录更多选项。

  • TFW 5 年后,你有一个问题,你找到了一个有用的答案,你读到了一条有用的评论并想“啊是的;我也注意到了这一点”,然后你意识到该评论是你的。 (23认同)
  • 奇怪的是,生成调色板使 GIF 的大小增加了两倍,尽管它大大提高了默认调色板的质量。我发现最好的方法是像往常一样用 ffmpeg 生成 GIF(可能在这个答案中使用更好的调色板)然后通过优化工具(也有在线工具)运行它,该工具可以使框架的不变部分透明或应用其他优化。 (6认同)

ube*_*kel 10

我尝试了所有这些技术,最终使用了https://ezgif.com

我不知道他们在幕后使用了什么魔法,但他们的压缩级别旋钮、调色板优化和分辨率降低带来了最高的视觉质量和最小的文件大小。

我尝试过-vf palettegen-filter_complex paletteuse但这消除了在同一运行中的能力-vf "scale=iw*.2:ih*.2",所以我必须单独执行此操作。而且 ffmpeg 创建的文件更大0.30.5这很奇怪。经过一个小时的摆弄,我尝试了 ezgif,效果很好。

  • 你可以用 `-filter_complex "paletteuse,scale=iw*.2:ih*.2"` 而不是 `-vf` (3认同)

abc*_*abc 6

vid=       
start_time=00:00:01
duration=5       
height=ih/2      # input height halved , can replace with pixils . 
width=-2         # keeps aspect ratio . can replace with pixils . 
fps=25           # frames per a second .

filters="fps=$fps,scale=$width:$height:flags=lanczos"

ffmpeg -ss $start_time                             \
       -t  $duration                               \
       -i  "$vid"                                  \
       -vf "$filters,palettegen"                   \
       -y  palette.png                             &&
ffmpeg -ss $start_time                             \
       -t  $duration                               \
       -i  "$vid"                                  \
       -i  palette.png                                \
       -lavfi "$filters [x]; [x][1:v] paletteuse"  \
       -y  "$vid".gif                              &&
rm palette.png 
Run Code Online (Sandbox Code Playgroud)

文档链接

更多信息