繁体   English   中英

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

[英]How to create function for FFmpeg lib to encode frame into any (possible) format?

因此,如何创建在其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);

可能吗? 请提供一个简单示例说明如何创建这种东西吗?

如果不诉诸极差的编程习惯(如全局变量),这是不可能的。 帧的编码不是独立的。 编码器必须保持一个状态(上下文),您必须为此状态保持一个指针以每次都传递给编码器功能。 将格式选择传递给EncodeFrame的想法也很愚蠢,因为如果不关闭现有的编码器上下文并切换到新的编码器上下文,就无法选择每帧的格式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM