gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:09 26 4
gpt4 key购买 nike

那么如何创建在其 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,您可能希望将 libavcodec 提供的 av 编解码器上下文指针包装在另一个结构中,您可以在其中保存运行时间戳值、swscale 上下文指针等。

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

关于c - 如何为 FFmpeg 库创建函数以将帧编码为任何(可能的)格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3200756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com