为什么H265解码器在开始解码之前必须等待数十帧数据?

时间:2019-01-23 20:11:00

标签: video-streaming codec libavcodec hevc libx265

我正在尝试基于H265编解码器以C ++构建实时视频流应用程序。我的应用程序非常关注实时性能,并且我建立了一个单线程程序来测试H265编解码器。该程序有一个简单的管道:

  1. 抢一帧;
  2. 馈入编码器;
  3. 将编码后的数据馈送到解码器;
  4. 如果没有解码的帧,则显示解码的结果或输出通知。

我尝试了X265/DE265组合,并且尝试了AV_CODEC_ID_HEVC组合的avcodec编码器和解码器,但发现一种现象,即解码器在第一帧的帧之后不会立即解码数据到达后,必须等到大约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秒。我想知道为什么以及是否有办法避免这种情况。

谢谢!

1 个答案:

答案 0 :(得分:0)

一个原因可能是B切片中的正向引用。

例如,通过选择具有分层结构的大小为32的图片组(GOP),您可以施加大约1秒的解码延迟(假设25fps)。

更准确地说,第二帧的重建(第一帧是Intra,因此可独立解码)可能间接取决于您的第32帧。

此编码模式通常称为随机访问。查一下您可以使用LowDelayP模式避免这种情况。或全部内部。 换句话说,延迟取决于您的GOP结构。