【问题标题】:FFMpeg, AVFrame and AVBufferFFMpeg、AVFrame 和 AVBuffer
【发布时间】:2015-07-15 03:34:36
【问题描述】:

我需要帮助理解 AVBuffer 和 AVFrame 之间的关系。我陷入这种困惑的原因是我正在尝试制作帧队列,并且我知道它可以通过“引用计数”来完成。

这是我的理解:
- 在 AVCondecContext 中设置 refcounted_frame = 1 可以通过 avcodec_framde_decode2() 启用引用计数/传递。
- 每次调用 avcodec_frame_decode2() 时,我都会在 AVFrame->buf 中获得一个新缓冲区。

我感到困惑的是:
- 引用的帧基本上是“以前的”AVFrame->data??
- 如果上述情况属实,我将如何引用计数的帧?我想通过 AVFrame->buf[i]?

非常感谢任何澄清。

-T

【问题讨论】:

标签: opencv ffmpeg


【解决方案1】:
  • 被引用的帧基本上是“以前的”AVFrame->数据吗??

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

还要注意,虽然名称相同,但引用计数和引用帧之间没有关系。

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

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

【讨论】:

  • 感谢您的信息!它确实为我澄清了一些关于 AVFrame 和 AVBuffer 的问题。但是,我确实还有其他问题-“引用计数”的目的/用途是什么?如何在我的场景中使用此功能??
  • 首先阅读en.wikipedia.org/wiki/Reference_counting - 然后考虑视频帧非常大(3MB 用于 8bit 4:2:0 1080p),我们创建了很多(25-50/秒) ,你可以看到参考计数是如何有目的的。如何使用它?很简单,就像你说的,AVCodecContext->refcounted_frame = 1,在你处理完frame之后调用av_frame_unref(),就这样了。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多