video-streaming - 为什么H265解码器要等几十帧数据才能开始解码?
问题描述
我正在尝试在基于 H265 编解码器的 C++ 中构建实时视频流应用程序。我的应用程序非常关心实时性能,并且我构建了一个单线程程序来测试 H265 编解码器。该程序有一个简单的管道:
- 抢一帧;
- 馈送到编码器;
- 将编码数据馈送到解码器;
- 如果没有帧解码,则显示解码结果或输出通知。
我试过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 秒。我想知道为什么以及是否有办法避免这种情况。
谢谢!
解决方案
一个原因可能是 B 片中的前向引用。
例如,通过选择大小为 32 的图片组 (GOP),采用分层结构,您可以施加大约 1 秒的解码延迟(假设为 25fps)。
更准确地说,您的第二帧的重建(第一帧是 Intra,因此可独立解码)可能间接取决于您的第 32 帧。
这种编码方式通常称为随机存取。查一下。您可以通过使用 LowDelayP 模式来避免它。或所有内部。换句话说,延迟取决于您的 GOP 结构。
推荐阅读
- servlets - 如何在骆驼servlet路由上设置超时
- database - laravel中选择多个表列和别名条件
- python - 我可以删除 Anaconda 根环境中的包吗?
- python - 更换标签 Tkinter
- android - Android E/FragmentManager:未找到 id 0x7f090030 的视图
- php - 如何获取表中的最后一组数据?代码点火器
- firebase - 如何构建流控制器以侦听 onAuthStateChanged 以进行 Firebase 身份验证?
- flutter - 使用flutter PageView时如何在滑动时跳过页面
- html - 链接元素不服从流式布局导致链接图像出现错误
- forms - 在验证器之外更新 TextFormField 的错误