【问题标题】:Why RTP/RTSP meddle with my H.264 NALs?为什么 RTP/RTSP 会干扰我的 H.264 NAL?
【发布时间】:2011-11-26 15:52:40
【问题描述】:

我查看了 RFC 并注意到可以解释为什么会发生以下情况(尽管解码器仍然可以生成原始电影)。

我使用 VSS h.264 编码器传输 H.264/AVC nals,字节流看起来像这样 E5 46 0E 4F FF A0 23...

当我在 RTP 广播器/RTSP 接收器之后的接收器端读取电影数据时,我得到了额外的未知数据,但总是在相同的位置,在开始代码前缀 (0x00000001) 之前添加了 8 个字节, 并在起始代码前缀后添加 2 个字节,看起来像这样。

XX XX XX XX XX XX XX XX 00 00 00 01 XX XX,然后我查看 Wireshark,我可以看到 RTP 将字节添加到数据负载中。

为什么会发生为什么?以及为什么解码器似乎可以很好地处理这些额外的字节?!

【问题讨论】:

    标签: c video-streaming h.264 rtsp rtp


    【解决方案1】:

    正如我在另一篇文章 Changing NALU h.264/avc, for RTP encupsulation 中提到的,H.264 是通过 RFC 3984 中定义的 RTP 传输的。这特别定义了如何将大型 NAL 单元分解为适合较小消息大小的较小部分,例如 UDP 数据报大小.也就是碎片化。

    接收器对数据进行解包并恢复 NALU,并使用这些额外信息来完成这项工作。

    因此,您基本上需要将您拥有的原始数据与 RFC 3984 格式进行比较。此外,Wireshark 已经通过将流量分解为可读项目来为您完成部分工作。

    【讨论】:

    • 仍然没有回答我的问题,额外的信息没有被完全删除,在接收器使用它之后它传播到解码器,xx代表接收器没有从nals中删除的额外信息“XX XX XX XX XX XX XX XX 00 00 00 01 XX XX"
    • 好吧,首先起始码不必通过 RTP 传输。这就是为什么您仍然必须通过 RFC 并与您的流进行比较的原因。你还看到起始码吗?您的设备可能出于某种原因发送它们,可能是由于错误。看看这个,这是一个 SEI NAL RTP 数据包的开始,没有开始代码,它是一个有效的流。 img691.imageshack.us/img691/9823/image003t.png
    • 我的意思是在 RTSP 接收器之后我对数据进行采样,如果 h.264 编码器不需要它,为什么这些数据会保留?!
    • 恐怕我还是错过了你的观点。您的问题是关于 RTSP/RTP,RTP 运营商不使用起始码。 RTSP/RTP 客户端可以使用起始码来重建 H.264 流,或者可以选择不使用它(例如,在 Windows 中,DirectShow AVC1 媒体类型是没有起始码的 H.264 视频)。如果您在 RTP 中看到代码,则发送方出于某种原因包括它们。如果它们不在网络上,并且 RTSP 接收器添加了它们,那么它与 RTP 无关。
    • H.264 编码器生成 nals,RTP 广播公司有时会使用 NALs 整体有时会对其进行分段。当我在 RTP 数据有效负载中查看 WireShark 时,我看到了 NAL 的数据(有时是整体,有时是分段的),但在 RTP 数据有效负载中还有我不希望 RTP 添加的其他数据,我认为它与带有 RTP 标头的 RTSP 协商字段,但无论如何,我一直在跟踪 Nals 数据,因为它在系统中进行,并注意到在使用 RTSP 对每个 RTP 标头进行解压缩之后,添加到 NAL 的附加数据没有被删除......
    【解决方案2】:

    那是一些混乱的流......你可以把它搞得更糟,它仍然可以工作,因为解码器将它解析为0x000001 起始代码,跳过开头添加的字节。最后的这两个新字节必须是 H264 碎片字节......或者与 H264 相关的东西,因为它们可以工作。

    所以基本上,这是由于有缺陷的分包器/RTSP 源过滤器。我的猜测是,如果您对这 8 个字节进行 ASCII 编码,您将获得 RTSP 源过滤器的供应商名称... xD

    【讨论】:

    • 所以你是说在 0x000001 之后我的 H.264 解码器跳过了添加的两个字节(00 00 00 01 XX XX)?!这似乎有点奇怪,因为解码器希望标头出现在每个 0x000001 之后。
    • 好吧,如果有数据包化,或者涉及到聚合,你就会有 2 个额外的字节。所以,我是说额外的 2 个字节是出于某种目的。如果您还没有 (ietf.org/rfc/rfc3984.txt) 并查看这两个字节是什么,您可以检查通过 RTP 传输的 H264 的有效负载格式。另外,在这里发布他们的价值观,也许我可以帮助...... ;)
    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2019-12-22
    相关资源
    最近更新 更多