Search code examples
ffmpegrgbgifrecordingvideo-recording

FFMPEG: Incompatible pixel format 'rgb24' for codec 'gif', auto-selecting format 'rgb8'


I use ffmpeg to record xvfb desktop with 24 bit color depth and save it in gif format (and then I pipe it to AWS so you can replace the ' - ' symbol with a filename.gif in the end of the command, it doesn't affect this issue):

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

However, I always get the warning:

Incompatible pixel format 'rgb24' for codec 'gif', auto-selecting format 'rgb8'

Which leads to incorrect color reproduction. I tried it both on Windows and Ubuntu Docker container, both pre-compiled and from source, from repository with last commits, but no luck. Also I've seen in the other people's logs that they use --pix_fmt rgb24 or bgr24 and it works just fine.

So the question is: is there anything I need to install or configure in order to use rgb24 with gif encoder? Or maybe there is a workaround like converting it to another format first?

Here is the part of my output:

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: the only workaround I've found is to split input video into jpegs and pipe them to ImageMagick which then concatenates jpegs to gif. This is extremely slow process and increases render time x20 times.


Solution

  • So (as Gyan said in the comments section) this is just a warning that ffmpeg is switching from unsupported pixel format by this codec to default. The issue with colors accuracy can be resolved by using per-frame optimized palette, here's documentation on palettegen and paletteuse, here's the example.