【问题标题】:FFMPEG: Incompatible pixel format 'rgb24' for codec 'gif', auto-selecting format 'rgb8'FFMPEG:编解码器“gif”的像素格式“rgb24”不兼容,自动选择格式“rgb8”
【发布时间】:2018-01-27 11:53:45
【问题描述】:

我使用 ffmpeg 录制具有 24 位色深的 xvfb 桌面并将其保存为 gif 格式(然后我将其通过管道传输到 AWS,以便您可以将“-”符号替换为 filename.gif 在命令末尾,不影响这个问题):

ffmpeg -f x11grab -video_size 800x600 -r 30 -i :99.0 -f gif -pix_fmt rgb24 -t 5 -

但是,我总是收到警告:

编解码器“gif”的像素格式“rgb24”不兼容,自动选择 格式'rgb8'

这会导致不正确的色彩再现。我在 Windows 和 Ubuntu Docker 容器上都进行了尝试,包括预编译和源代码、最后一次提交的存储库,但没有运气。我还在其他人的日志中看到他们使用 --pix_fmt rgb24bgr24 并且效果很好。

所以问题是:我需要安装或配置什么才能将 rgb24 与 gif 编码器一起使用吗?或者也许有一种解决方法,比如先将其转换为另一种格式?

这是我输出的一部分:

ffmpeg version git-2017-08-18-f386dd7 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
  configuration: --enable-gpl --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3 --enable-libxcb
  libavutil      55. 74.100 / 55. 74.100
  libavcodec     57.102.100 / 57.102.100
  libavformat    57. 76.100 / 57. 76.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 99.100 /  6. 99.100
  libswscale      4.  7.102 /  4.  7.102
  libswresample   2.  8.100 /  2.  8.100
  libpostproc    54.  6.100 / 54.  6.100


Input #0, x11grab, from ':99.0':
  Duration: N/A, start: 1503077459.413864, bitrate: N/A
    Stream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 1024x768, 30 fps, 1000k tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> gif (native))
Press [q] to stop, [?] for help
Incompatible pixel format 'bgr24' for codec 'gif', auto-selecting format 'rgb8'


Output #0, gif, to 'pipe:':
  Metadata:
    encoder         : Lavf57.76.100
    Stream #0:0: Video: gif, rgb8, 1024x768, q=2-31, 200 kb/s, 30 fps, 100 tbn, 30 tbc
    Metadata:
      encoder         : Lavc57.102.100 gif

PS:我发现的唯一解决方法是将输入视频拆分为 jpeg 并将它们通过管道传输到 ImageMagick,然后将 jpeg 连接到 gif。这是一个极其缓慢的过程,并且渲染时间增加了 20 倍。

【问题讨论】:

  • ffmpeg 的 gif 编码器报告 Supported pixel formats: rgb8 bgr8 rgb4_byte bgr4_byte gray pal8,所以看起来不可能。
  • 但是互联网上有大量使用 grb24 格式的帖子,而且似乎对他们有用:这里 bl.ocks.org/joyrexus/7042973 这里 askubuntu.com/a/110320/348082 和许多其他地方。
  • 嗯,命令不会失败。 ffmpeg 只是插入一个缩放器来改变格式。为了保持色彩保真度,您需要每帧优化的调色板。见superuser.com/a/1239082/114058
  • @Mulvya thanx,这有助于解决不正确的色彩再现问题,尽管性能显着下降。是否可以每 30 帧生成 1 个调色板?
  • 这里的答案解决了我的问题superuser.com/questions/436056/…

标签: ffmpeg rgb gif recording video-recording


【解决方案1】:

因此(正如Gyan 在 cmets 部分中所说),这只是一个警告,表明 ffmpeg 正在从此编解码器不支持的像素格式切换为默认格式。 颜色准确性问题可以通过使用每帧优化调色板来解决,这里是 palettegenpaletteuse 的文档,这里是 example

【讨论】:

    【解决方案2】:

    我的一个解决方案是安装 ffmpegimagemagick(在 mac 上):

    brew install ffmpeg
    brew install imagemagick 
    

    然后cd.mov 文件所在的目录并运行以下命令。

    mkdir output
    ffmpeg -i myvideo.mov -vf scale=1024:-1 -r 10 output/ffout%3d.png
    convert -delay 8 -loop 0 output/ffout*.png output/animation.gif
    

    第一个创建一个output 目录。第二个命令为每一帧创建一个 .png 文件(由 -r 标志指定,表示 10 fps)。第三个命令使用 imagemagick 从先前创建的图像文件中创建一个 gif 文件,延迟为8ms。最后的 gif 文件是 output/animation.gif 文件。

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多