如何为FFmpeg lib创建函数以将帧编码为任何(可能的)格式?

时间:2010-07-08 04:56:55

标签: c video ffmpeg frame encode

那么如何在api中创建具有类似内容的东西:

Encoder = EncoderFormat(format name); // prepare encoder
//...code for frames generation... now we want to encode frame!//
EncodeFrame(const CImage* src, void* dest, int* is_keyframe, more args if needed);

有可能吗?请任何人提供如何创建此类事物的简单示例?

1 个答案:

答案 0 :(得分:1)

如果不采用极端糟糕的编程实践(如全局变量),这是不可能的。帧的编码不是独立的;编码器必须保持状态(上下文),每次必须保持指针传递给编码器功能。将选择的格式传递给EncodeFrame的想法也相当愚蠢,因为如果不关闭现有的编码器上下文并切换到新的编码器上下文,就无法选择每帧格式。

除非源图像已经是编码器想要的格式(可能是YUV 4:2:0),否则你的包装器需要转换它。这可以单独完成,也可以使用ffmpeg中的libswscale完成。您还需要为每个帧提供时间戳。如果你想要一个简单的API,你不必担心这些东西,你可能想要包装av编解码器上下文指针libavcodec给你另一个结构,你保持运行时间戳值,swscale上下文指针等。

除此之外,您的API无法指定目标缓冲区的大小,因此它完全不安全。最好返回一个指向内部缓冲区的指针(通过返回值或指针到指针的参数)以及编码的帧大小,而不是写入调用者的缓冲区。