FFMPEG:不兼容的像素格式';rgb24';对于编解码器';gif';,自动选择格式';rgb8';

FFMPEG:不兼容的像素格式';rgb24';对于编解码器';gif';,自动选择格式';rgb8';,ffmpeg,rgb,gif,recording,video-recording,Ffmpeg,Rgb,Gif,Recording,Video Recording,我使用ffmpeg录制具有24位颜色深度的xvfb桌面,并将其保存为gif格式(然后我将其传送到AWS,以便您可以在命令末尾将“-”符号替换为文件名。gif,这不会影响此问题): 然而,我总是得到警告: 编解码器“gif”的像素格式“rgb24”不兼容,自动选择 格式“rgb8” 这会导致不正确的颜色复制。我在Windows和UbuntuDocker容器上都试过了,都是预编译的,都是源代码,都是最后提交的存储库,但没有成功。另外,我在其他人的日志中看到,他们使用-pix_fmt rgb24或bg

我使用ffmpeg录制具有24位颜色深度的xvfb桌面,并将其保存为gif格式(然后我将其传送到AWS,以便您可以在命令末尾将“-”符号替换为文件名。gif,这不会影响此问题):

然而,我总是得到警告:

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

这会导致不正确的颜色复制。我在Windows和UbuntuDocker容器上都试过了,都是预编译的,都是源代码,都是最后提交的存储库,但没有成功。另外,我在其他人的日志中看到,他们使用-pix_fmt rgb24或bgr24,效果很好

所以问题是:为了使用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倍。

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

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

因此(如评论部分所述),这只是一个警告,表明ffmpeg正在从该编解码器不支持的像素格式切换到默认格式。
颜色精度问题可以通过使用每帧优化调色板来解决,以下是和的文档。

ffmpeg的gif编码器报告
支持的像素格式:rgb8 bgr8 rgb4字节bgr4字节灰色pal8
,所以看起来不太可能。但是在互联网上有大量使用grb24格式的帖子,而且似乎对他们有效:这里和其他很多地方。好吧,这个命令并没有失败。ffmpeg只需插入一个定标器来更改格式。要保持颜色保真度,您需要每帧优化调色板。请参阅@Mulvya-thanx,这有助于解决不正确的颜色复制问题,尽管性能显著下降。有可能每30帧生成一个调色板吗?这里的答案解决了我的问题
brew install ffmpeg
brew install imagemagick 
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