FFMPEG - 无法使用RGB24像素格式的一系列图像创建视频

时间:2016-07-20 22:33:59

标签: video ffmpeg video-encoding libavcodec libav

目标

我正在编写一个小概念验证应用程序来获取我从数码相机(一系列RGB24图像)获取的原始图像数据,并将它们组合成一个简单的无音频视频文件。

工作到目前为止

初始化代码如下:

AVCodec* pCodec = NULL;
AVCodecContext* pCodecContext = NULL;
AVFrame* pFrame = NULL;

/* Register all available codecs. */
avcodec_register_all();

/* Determine if desired video encoder is installed. */
pCodec = avcodec_find_encoder(CODEC_ID_MJPEG);
if (!pCodec) {
    printf("Codec not installed!\n");
}

pCodecContext = avcodec_alloc_context3(pCodec);
pFrame = avcodec_alloc_frame();

非常干爽。但是,当我尝试注册编解码器时,它会因我的自定义错误消息而失败,并且直接从FFMPEG库中删除了一个漂亮的颜色编码格式:

[mjpeg @ 0x650d00] Specified pixel format rgb24 is invalid or not supported
Codec not available.

我可以很容易地确认该像素格式有效:

Pixel formats:
I.... = Supported Input  format for conversion
.O... = Supported Output format for conversion
..H.. = Hardware accelerated format
...P. = Paletted format
....B = Bitstream format

2>&1 ffmpeg -pix_fmts | grep -i -e rgb24 -e flags
FLAGS NAME            NB_COMPONENTS BITS_PER_PIXEL
IO... rgb24                  3            24

我还可以确认我正在尝试使用的视频编解码器对编码有效。

Codecs:
 D..... = Decoding supported
 .E.... = Encoding supported
 ..V... = Video codec
 ..A... = Audio codec
 ..S... = Subtitle codec
 ...I.. = Intra frame-only codec
 ....L. = Lossy compression
 .....S = Lossless compression

2>&1 ffmpeg -codecs | grep -i mjpeg              
 DEVIL. mjpeg                Motion JPEG

问题

为什么不支持此像素格式?当与其他实用程序(如MATLAB,OpenCV,FreeImage等)一起使用时,它似乎很常见。在FFMPEG / AVcodec中是否有任何可以解决此问题的选项或函数?如果可能的话,我想避免手动将图像转换为不同的颜色空间,因此我不会通过首先将RGB24图像转换为新格式来烧掉CPU周期,那么用它编码视频帧。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您运行ffmpeg -h encoder=mjpeg,您会看到

...
Encoder mjpeg [MJPEG (Motion JPEG)]:
    General capabilities: threads
    Threading capabilities: frame and slice
    Supported pixel formats: yuvj420p yuvj422p yuvj444p

JPEG使用编码为YUV的像素。其中qtrlepnglibx264rgb会接受RGB,但应保存为.mov - Quicktime。