如何让 ffmpeg 将 .mov 转换为 .gif?

Dan*_*her 132 gif ffmpeg conversion

我正在尝试将 .mov 转换为 .gif,但没有成功。

这是错误:

ffmpeg -pix_fmt rgb24 -i yesbuddy.mov output.gif
ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers
  built on Jun 12 2012 17:47:34 with clang 2.1 (tags/Apple/clang-163.7.1)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/0.11.1 --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-libfreetype --cc=/usr/bin/clang --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libass --enable-libvo-aacenc --disable-ffplay
  libavutil      51. 54.100 / 51. 54.100
  libavcodec     54. 23.100 / 54. 23.100
  libavformat    54.  6.100 / 54.  6.100
  libavdevice    54.  0.100 / 54.  0.100
  libavfilter     2. 77.100 /  2. 77.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Option pixel_format not found.
Run Code Online (Sandbox Code Playgroud)

如果我省略 -pix_fmt rgb24 部分,它会抱怨。关于如何修复的想法?

Ple*_*and 206

命令行参数的顺序很重要。这个命令行应该可以工作,但会生成一个巨大的文件:

ffmpeg -i yesbuddy.mov -pix_fmt rgb24 output.gif
Run Code Online (Sandbox Code Playgroud)

请注意,您可能希望在转换时降低帧速率和大小,并指定开始时间和持续时间。您可能不想以其原始分辨率和帧速率转换整个文件。

ffmpeg -ss 00:00:00.000 -i yesbuddy.mov -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
Run Code Online (Sandbox Code Playgroud)

文件大小仍然很大。您可以使用ImageMagick的 GIF 优化器来减小尺寸:

convert -layers Optimize output.gif output_optimized.gif
Run Code Online (Sandbox Code Playgroud)

  • ffmpeg 抱怨像素格式,并从 rgb24 切换到 pal8;应该更新答案中的命令吗? (22认同)
  • 编解码器“gif”不兼容的像素格式“rgb24” (8认同)
  • 很棒的答案,谢谢:) GIF 是一种疯狂的格式……原始 .mov 是 250k,从 ffmpeg 转换后的 .gif 是 8mb,而 `convert` 优化版本是惊人的 10k!感人的! (3认同)
  • @Andy 在我的 ffmpeg 版本中自动修复为 rgb8。 (2认同)

小智 20

转换后:

ffmpeg -i input.mp4 input.gif 
Run Code Online (Sandbox Code Playgroud)

尝试优化帧:

convert input.gif -verbose -coalesce -layers OptimizeFrame input_optframe.gif
Run Code Online (Sandbox Code Playgroud)

并用于gifsicle进行最终优化:

gifsicle -O2 input_optframe.gif -o optimized.gif
Run Code Online (Sandbox Code Playgroud)

从 12.2mb 的视频中获得了 6.8mb 的 GIF,质量几乎相同!

  • 介意解释这些步骤是如何工作的以及它们在做什么吗? (5认同)

小智 10

我制作了一个工具,将 FFmpeg、ImageMagick 和 giflossy 捆绑到一个易于使用的命令行程序中,您可以在一行中安装:https : //github.com/vvo/gifify

我建议任何愿意将视频 => GIF 转换为使用它的人,而不是尝试花费大量时间浏览 3 个文档网站来了解如何调整 GIF 大小或更改开始/结束时间。

  • 如果你的机器上运行着 Docker,只需做一个像这样的别名:```alias gifify='docker run -it --rm -v $(pwd):/data maxogden/gifify'``` 然后使用它```gifify screencast.mkv -o screencast.gif --resize 800:-1``` (2认同)

Shu*_*man 7

ffmpeg -y -i input.mp4 -f image2pipe -vcodec ppm - | convert -delay 2 -loop 0 -layers Optimize - gif:- | gifsicle -d 3 -O3 -o optimized.gif
Run Code Online (Sandbox Code Playgroud)

首先使用ffmpeg通过管道将mp4文件转换为图像,然后使用imagemagick将其压缩为gif,最后使用gifsicle对其进行优化

我不知道为什么直接使用gifscicle不起作用。

或者你可以通过这个缩小 gif

convert -dither none -matte -depth 8 -deconstruct -layers optimizePlus -colors 32 in.gif out.gif
Run Code Online (Sandbox Code Playgroud)


小智 7

ffmpeg -i <input source> -filter_complex "[0:v] fps=12,scale=<width>:-1,split [a][b];[a] palettegen [p];[b][p] paletteuse" <output file>
Run Code Online (Sandbox Code Playgroud)

在此命令中,您需要插入 3 个标记。<input source>将类似于your-recording.mov<width>应该是您希望最终 gif 的宽度,并且<output file>将类似于recording.gif.

此命令分解为:

  • filter_complex 我们将把一些过滤器链接在一起
  • [0:v] fps=12 以每秒 12 帧的速度获取容器中的第一个视频流
  • scale=1024:-1 将宽度调整为 1024 并保持高度的纵横比
  • split [a][b] 获取当前流并将其拆分为两个(基本上是克隆它)
  • ; 新过滤器传入
  • [a] palettegen [p] 取“a”流并生成一个名为“p”的调色板
  • ; 新过滤器传入
  • [b][p] paletteuse 取“b”流并应用“p”调色板

屏幕录制并不总是需要调色板的东西,但绝对需要为录制的视频提供更好的颜色。

您也可以插入-ss 00:00:00.000-t 00:00:00.000根据需要,如果你将要修剪它。