【问题标题】:ffmpeg: save separate frames as still gifsffmpeg:将单独的帧保存为静止的 gif
【发布时间】:2013-09-02 19:29:25
【问题描述】:

问题很简单:我不希望 ffmpeg 从给定的视频流创建动画 GIF,我想要单独的帧,每个帧都是 GIF 格式。但是当我将输出文件设置为frame%09d.gif 之类的东西时,ffmpeg 往往会创建一个动画(并将其完全存储为frame%09d.gif)。 -f gif 选项也是如此。

当然,我可以保存 PNG 并使用 ImageMagic 的 convert 实用程序将它们转换为 GIF,但我不想要任何额外的调用开销,因为我正在处理实时流并处理大量数据。

这就是我所做的,没什么特别的:

ffmpeg -i http://brightcove03-f.akamaihd.net/valgbodmandag1378107345_1_300k@80362 -f gif -y frame_%09d.gif

ffmpeg version N-54643-g15cee5e Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 11 2013 03:35:11 with gcc 4.7.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnu
tls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --ena
ble-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger -
-enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-lib
vpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 39.100 / 52. 39.100
  libavcodec     55. 18.102 / 55. 18.102
  libavformat    55. 12.101 / 55. 12.101
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 80.100 /  3. 80.100
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
[flv @ 00000000002cb700] Stream discovered after head already parsed
Input #0, flv, from 'http://brightcove03-f.akamaihd.net/valgbodmandag1378107345_1_300k@80362':
  Metadata:
    encoder         : Lavf54.6.100
  Duration: 00:00:00.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 480x270 [SAR 1:1 DAR 16:9], 25 tbr, 1k tbn, 50 tbc
    Stream #0:1: Audio: aac, 44100 Hz, stereo, fltp, 128 kb/s
    Stream #0:2: Data: none
[swscaler @ 0000000004d051e0] No accelerated colorspace conversion found from yuv420p to bgr8.
Output #0, gif, to 'frame_%09d.gif':
  Metadata:
    encoder         : Lavf55.12.101
    Stream #0:0: Video: gif, bgr8, 480x270 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 100 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> gif)
Press [q] to stop, [?] for help
frame=  141 fps=130 q=-1.0 Lsize=    4960kB time=00:00:05.68 bitrate=7153.1kbits/s
video:5100kB audio:0kB subtitle:0 global headers:0kB muxing overhead -2.743247%

毕竟我得到了一个名为“frame_%03d.gif”的文件,但我想要几个文件“frame_001.gif”、“frame_002.gif”等。

有什么想法吗? 提前致谢。

【问题讨论】:

  • 显示你的 ffmpeg 命令和完整的控制台输出。

标签: ffmpeg gif


【解决方案1】:

当您使用-f gif 时,您会强制 ffmpeg 使用 GIF 复用器,它将转换后的视频流写入单个动画 GIF 文件。

使用最近的 ffmpeg:

使用它来强制 ffmpeg 将每一帧作为 GIF 复用到一个单独的文件中:

ffmpeg -i input -c:v gif -f image2 out%04d.gif

使用 ffmpeg 1.2.1 及更低版本:

当您省略-f gif 时,ffmpeg 会为每一帧正确生成单个图像:

ffmpeg -i input output%04d.gif

如果您仍然停留在 have this bug 的版本上(即可能是 2.0 和 2.1),则 ffmpeg 不遵循上述语法。您唯一的选择是创建 PNG 图像:

ffmpeg -i input output%04d.png

并使用ImageMagick 转换它们:

for f in output*.png; do convert "$f" "${f%.png}.gif"; done

【讨论】:

  • 如果没有直接指定其他文件,ffmpeg 似乎会根据输出文件扩展名选择输出格式。所以,你的方法行不通。如果我指定 -f image2 选项,ffmpeg 会生成一组带有 .gif 扩展名(或我在输出中设置的任何内容)的文件,这些文件实际上是 JPEG。
  • “如果没有直接指定其他文件扩展名,ffmpeg 似乎会根据输出文件扩展名选择输出格式” – 是的,是的。有趣的是,它选择了带有.gif 扩展名的gif 复用器,而不是image2。使用 image2 会生成 MJPEG。但是:如果您不完全强制使用格式,它可以工作。所以只需忽略-f 选项。我在 1.2.1 版和 Git master 的最新版本上都对其进行了测试。
  • 由于某种原因它对我不起作用。请参阅screenshot
  • 是的,这就是我要避免的。还是谢谢你。
猜你喜欢
  • 2017-02-18
  • 2012-02-14
  • 2021-02-23
  • 1970-01-01
  • 2020-05-28
  • 2023-03-07
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多