Opencv FFMpeg、AVFrame和AVBuffer

Opencv FFMpeg、AVFrame和AVBuffer,opencv,ffmpeg,Opencv,Ffmpeg,我需要帮助理解AVBuffer和AVFrame之间的关系。我陷入这种混乱的原因是,我试图对帧进行排队,我知道这可以通过“引用计数”来实现 这就是我的理解: -在AVCondecContext中设置refcounted\u frame=1可以通过avcodec\u framde\u decode2()进行引用计数/传递。 -每次调用avcodec\u frame\u decode2()时,我都会在AVFrame->buf中获得一个新的缓冲区 我感到困惑的是: -参考帧基本上是“上一个”AVFram

我需要帮助理解AVBuffer和AVFrame之间的关系。我陷入这种混乱的原因是,我试图对帧进行排队,我知道这可以通过“引用计数”来实现

这就是我的理解:
-在AVCondecContext中设置refcounted\u frame=1可以通过avcodec\u framde\u decode2()进行引用计数/传递。
-每次调用avcodec\u frame\u decode2()时,我都会在AVFrame->buf中获得一个新的缓冲区

我感到困惑的是:
-参考帧基本上是“上一个”AVFrame->数据吗??
-如果上述情况属实,我将如何引用计数的帧?我想通过AVFrame->buf[I]

如有任何澄清,我们将不胜感激

-T

  • 参考帧基本上是“先前的”AVFrame->data
嗯,有点像,但请注意,大多数现代编解码器支持多个引用,因此过去的N AVFrame->data[]在编解码器内部缓存,用作后续帧的帧间预测中的引用帧

还要注意,尽管名称相同,但参考计数和参考帧之间没有关系

  • 如果上述情况属实,我将如何引用计数的帧?我想通过AVFrame->buf[I]

不,AVFrame->buf[]只是属于AVFrame->data[]中平面数据的缓冲区对象的占位符。帧还保存其他缓冲区,例如用于侧数据的缓冲区。如果您想要访问解码器可能用作帧间预测中参考帧的先前帧,则必须在返回帧时手动缓存帧。还要注意的是,vp9和hevc有一个不可见帧的概念,这些不可见帧永远不会返回给用户,并且只存在于内部,用于在解码器中对后续帧进行编码。

谢谢您提供的信息!它确实为我澄清了一些关于AVFrame和AVBuffer的事情。不过,我还有一个问题,“参考资料统计”的目的/用途是什么?如何在我的场景中使用这个函数?首先读取-然后考虑视频帧相当巨大(3MB为8bit 4:2:01080p),并且我们创建了很多(25-50/s),并且你可以看到ReF计数有什么用途。如何使用它?很简单,正如您所说,AVCodecContext->refcounted_frame=1,在处理完帧后调用av_frame_unref(),仅此而已。下面是一个使用引用计数的示例: