为什么H265解码器要等几十帧数据才开始解码?
Why does H265 decoder has to wait for tens of frames of data before start decoding?
我正在尝试基于 H265 编解码器在 C++ 中构建实时视频流应用程序。我的应用程序非常关心实时性能,我构建了一个单线程程序来测试 H265 编解码器。该程序有一个简单的管道:
- 抓取一帧;
- 馈入编码器;
- 将编码数据提供给解码器;
- 显示解码结果或无帧解码输出提示
试过X265/DE265
组合,avcodec
组合中的AV_CODEC_ID_HEVC
编码器和解码器,发现解码器解码后"right away"不解码的现象第一帧数据到达,要等到大约30帧数据后才开始输出解码结果。情况是这样的:
**encoding** **decoding**
frame 1: succeeded -> no frame decoded
frame 2: succeeded -> no frame decoded
frame 3: succeeded -> no frame decoded
...
frame 30: succeeded -> no frame decoded
frame 31: succeeded -> frame 1 outputted
frame 32: succeeded -> frame 2 outputted
...
这将导致编码器延迟 1 到 2 秒。我想知道为什么以及是否有办法避免这种情况。
谢谢!
一个原因可能是 B 切片中的前向引用。
例如,通过选择大小为 32 的具有层次结构的图片组 (GOP),您可以施加大约 1 秒的解码延迟(假设 25fps)。
更准确地说,您的第二帧(第一帧是帧内帧,因此可独立解码)的重建可能间接取决于您的第 32 帧。
这种编码方式通常称为Random Access。查一下。您可以使用 LowDelayP 模式避免它。或所有内部。
换句话说,延迟取决于您的 GOP 结构。
我正在尝试基于 H265 编解码器在 C++ 中构建实时视频流应用程序。我的应用程序非常关心实时性能,我构建了一个单线程程序来测试 H265 编解码器。该程序有一个简单的管道:
- 抓取一帧;
- 馈入编码器;
- 将编码数据提供给解码器;
- 显示解码结果或无帧解码输出提示
试过X265/DE265
组合,avcodec
组合中的AV_CODEC_ID_HEVC
编码器和解码器,发现解码器解码后"right away"不解码的现象第一帧数据到达,要等到大约30帧数据后才开始输出解码结果。情况是这样的:
**encoding** **decoding**
frame 1: succeeded -> no frame decoded
frame 2: succeeded -> no frame decoded
frame 3: succeeded -> no frame decoded
...
frame 30: succeeded -> no frame decoded
frame 31: succeeded -> frame 1 outputted
frame 32: succeeded -> frame 2 outputted
...
这将导致编码器延迟 1 到 2 秒。我想知道为什么以及是否有办法避免这种情况。
谢谢!
一个原因可能是 B 切片中的前向引用。
例如,通过选择大小为 32 的具有层次结构的图片组 (GOP),您可以施加大约 1 秒的解码延迟(假设 25fps)。
更准确地说,您的第二帧(第一帧是帧内帧,因此可独立解码)的重建可能间接取决于您的第 32 帧。
这种编码方式通常称为Random Access。查一下。您可以使用 LowDelayP 模式避免它。或所有内部。 换句话说,延迟取决于您的 GOP 结构。