【发布时间】:2016-03-22 07:05:07
【问题描述】:
我正在开发一个应用程序,该应用程序需要通过 UDP 实时传输 H.264 编码的视频(一种视频通话)。
最近我们改用了硬件编码器,它仅支持有限数量的 H.264 配置文件。结果,每个编码的视频帧现在都由一个 NALu 组成。更准确地说,对于 IDR(关键)帧,编码器生成 SSP、PSP 和单个 IDR 切片,对于其他帧 - 单个非 IDR 切片。
现在,我的目标是将切片 NALu 拆分为几个较小的切片,因为如果 NALu 无法完全组装,则会出现数据包丢失 - 它完全丢失了。至少我需要在空间上分割切片,即将宏块范围放入不同的 NALus。如果可能的话 - 我还想提取质量层,以便基础层可以受到更多冗余数据包 (FEC) 的保护。
注意:我不是在谈论转码。这是关于重新打包/重新格式化,定位宏块定义数据块并以不同的方式放置它们。
我现在尝试使用 H.264 标准规范和一些开源解码器代码来解析适当的数据头:SPS、PPS 和编码切片。这项任务似乎是可能的,虽然有点棘手,但有很多技术细节。
我的问题是:这是一个已知问题吗?是否有一些 API/库可以做到这一点?
【问题讨论】:
-
@aergistal - 谢谢,我们已经使用 FEC 并通过 RTP 传输(使用 ffmpeg)。然而这种情况是全有或全无的,要么整个 NALu 完全恢复,要么不完全恢复。而我想要几个更小的 NALus 来恢复帧的一部分。
-
@valdo “这是一个已知问题吗?”是什么意思?
-
为了您将单个 NALu 重新打包成多个数据包的目标,可以通过 RTP FU Packetization mode 实现
-
@valdo 知道了;如果您的目标是恢复部分帧(以防丢包),FU 打包模式没有帮助。您正在尝试做的是一项壮举。我很清楚这样的任务所涉及的复杂性,因为我在 H264 解码器(包括错误恢复和隐藏)上工作了很多年。顺便说一句,您的解决方案碰巧是一个闭环解决方案吗?如果是闭环解决方案,我可以建议一种方法
标签: c++ video-streaming h.264