【问题标题】:H.264 coded NAL/slice splittingH.264 编码的 NAL/片分割
【发布时间】: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/库可以做到这一点?

【问题讨论】:

  • 您应该发布硬件编码器的型号,有人可能知道如何配置它以产生小于某个值(如 MTU)的 NALu。对于 FEC,您可以使用 RTP。常见的打包规则可以看RFC 6184,FEC看RFC 5109
  • @aergistal - 谢谢,我们已经使用 FEC 并通过 RTP 传输(使用 ffmpeg)。然而这种情况是全有或全无的,要么整个 NALu 完全恢复,要么不完全恢复。而我想要几个更小的 NALus 来恢复帧的一部分。
  • @valdo “这是一个已知问题吗?”是什么意思?
  • 为了您将单个 NALu 重新打包成多个数据包的目标,可以通过 RTP FU Packetization mode 实现
  • @valdo 知道了;如果您的目标是恢复部分帧(以防丢包),FU 打包模式没有帮助。您正在尝试做的是一项壮举。我很清楚这样的任务所涉及的复杂性,因为我在 H264 解码器(包括错误恢复和隐藏)上工作了很多年。顺便说一句,您的解决方案碰巧是一个闭环解决方案吗?如果是闭环解决方案,我可以建议一种方法

标签: c++ video-streaming h.264


【解决方案1】:

问题是:这是一个已知问题吗?是否有一些 API/库可以做到这一点?"

没有我知道的 API 库,但我相信你可以在源代码中找到你的解决方案,或者接近你的解决方案,可以从 github 上的 h264bitstream 项目编译到库中:https://github.com/aizvorski/h264bitstream/blob/master/svc_split.c 让我们知道它是如何为您工作的。当然,您必须在这里阅读一些代码,但基本解决方案或接近解决方案似乎就在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多