FFMpeg, AVFrame and AVBuffer

4
我需要帮助了解AVBuffer和AVFrame之间的关系。我对这个问题感到困惑的原因是我试图通过“引用计数”来制作帧队列。
下面是我的理解: - 在AVCondecContext中设置refcounted_frame = 1,可以通过avcodec_framde_decode2()启用引用计数/传递。 - 每次调用avcodec_frame_decode2()时,都会在AVFrame->buf中得到一个新的缓冲区。
以下是我困惑的地方: - 引用的帧基本上就是“以前”的AVFrame->data吗? - 如果以上是正确的,那么我该如何引用计算的帧?我是否可以通过AVFrame->buf[i]来实现?
非常感谢任何澄清。
-T

这是一个使用引用计数的示例:https://ffmpeg.org/doxygen/trunk/demuxing__decoding_8c_source.html - Sergio Basurco
1个回答

3
基本上,被引用的帧是“前一个”AVFrame->data吗? 是的,但请注意,大多数现代编解码器支持多个引用,因此过去N个AVFrame->data[]在编解码器内部缓存,用作后续帧的预测参考帧。 还要注意,尽管名称相同,但引用计数和参考帧之间没有关系。
如果以上内容属实,我该如何引用计数的帧?我是否可以通过AVFrame->buf[i]来引用计数的帧? 不,AVFrame->buf[]只是占位符,用于属于AVFrame->data[]中平面数据的缓冲区对象。该帧还保存其他缓冲区,例如用于辅助数据的缓冲区。如果您想访问解码器可能用作参考帧的先前帧以进行预测,请手动缓存帧,因为它们返回。还要注意,vp9和hevc有一个不可见帧的概念,它们永远不会返回给用户,仅存在于解码器中用于编码后续帧。

谢谢提供这些信息!对于AVFrame和AVBuffer,我有了更清晰的理解。但是我还有一个问题——“引用计数”的目的/用途是什么?在我的情况下,如何使用此功能? - thebearot
首先阅读 https://en.wikipedia.org/wiki/Reference_counting - 然后考虑到视频帧非常大(8位4:2:0 1080p每帧3MB),我们创建了大量这样的帧(每秒25-50帧),你可以看到引用计数的用途。如何使用它?很简单,就像你说的那样,AVCodecContext->refcounted_frame = 1,在完成帧后调用av_frame_unref(),就这样。 - Ronald S. Bultje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接