C 为什么RTP/RTSP会干涉我的H.264 NAL?

C 为什么RTP/RTSP会干涉我的H.264 NAL?,c,video-streaming,h.264,rtsp,rtp,C,Video Streaming,H.264,Rtsp,Rtp,我查看了RFC,没有任何东西可以解释为什么会发生以下情况(尽管解码器仍然可以制作原始电影) 我使用VSS H.264编码器传输H.264/AVC NAL,字节流看起来像E5 46 0E 4F FF A0 23 当我在RTP广播/RTSP接收器之后的接收器一侧读取电影数据时,我会获得额外的未知数据,但总是在相同的位置,在开始代码前缀(0x00000001)之前添加8个字节, 在开始代码前缀后面加上2个字节,看起来像这样 XX XX XX XX XX XX XX XX XX 00 00 00 01

我查看了RFC,没有任何东西可以解释为什么会发生以下情况(尽管解码器仍然可以制作原始电影)

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

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

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


为什么会这样?为什么?为什么解码器似乎能很好地处理这些额外的字节

正如我在另一篇文章中提到的,H.264是通过RFC3984中定义的RTP传输的。这特别定义了大型NAL单元如何精确地分解为适合较小消息大小的较小部分,如UDP数据报大小。也就是说,碎片化

接收器将数据解包并恢复NALU,它使用这些额外的信息来完成这项工作


所以,您需要将原始数据与RFC3984格式进行比较。此外,Wireshark已经通过将流量分解为可读项为您完成了部分工作

正如我在另一篇文章中提到的,H.264是通过RFC3984中定义的RTP传输的。这特别定义了大型NAL单元如何精确地分解为适合较小消息大小的较小部分,如UDP数据报大小。也就是说,碎片化

接收器将数据解包并恢复NALU,它使用这些额外的信息来完成这项工作


所以,您需要将原始数据与RFC3984格式进行比较。此外,Wireshark已经通过将流量分解为可读项为您完成了部分工作

上游有些混乱。。。你可以把它搞得更糟,它仍然可以工作,因为解码器会解析它的
0x000001
start code,跳过在开头添加的字节。结尾的这两个新字节必须是H264碎片字节。。。或者一些H264相关的东西,因为它们起作用了


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

这是一条混乱的上游。。。你可以把它搞得更糟,它仍然可以工作,因为解码器会解析它的
0x000001
start code,跳过在开头添加的字节。结尾的这两个新字节必须是H264碎片字节。。。或者一些H264相关的东西,因为它们起作用了


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

它仍然没有回答我的问题,额外的信息没有被完全删除,在接收器使用它之后,它传播到解码器。xx代表接收器没有从nals中删除的额外信息“xx xx xx xx xx xx xx xx xx xx xx 00 00 00 01 xx xx xx xx xx”,首先,启动码不必通过RTP传输。这就是为什么您仍然需要通过RFC并与流进行比较。你还看到启动码吗?您的设备可能出于某种原因发送它们,可能是由于错误。检查这个,这是一个SEI NAL RTP数据包的开始,没有开始代码,它是一个有效流。我的意思是,在RTSP接收器采集数据后,如果h.264编码器不需要,为什么这些数据会保留下来?!恐怕我还是没有领会你的意思。您的问题是关于RTSP/RTP,RTP运营商不使用起始代码。RTSP/RTP客户端可以使用开始代码来重建H.264流,也可以选择不使用它(例如,在Windows中,DirectShow AVC1媒体类型是没有开始代码的H.264视频)。如果您在RTP中看到这些代码,那么出于某种原因,发送方会包含它们。如果它们不在线路上,RTSP接收器添加它们,则与RTP无关。H.264编码器生成NAL,RTP广播公司有时将NAL整段,有时将其分段。当我查看RTP数据有效载荷中的WireShark时,我看到了NAL的数据(有时是完整的,有时是分段的),但在RTP数据有效载荷中,有我不希望RTP添加的额外数据,我认为它会与RTSP协商RTP头的字段,但不管怎样,我一直在跟踪Nals数据在系统中的进展,并注意到添加到NAL的附加数据没有被删除,在使用RTSP对每个RTP报头进行解算后…它仍然没有回答我的问题,附加信息没有被完全删除,在接收机使用它后,它将其传播到解码器,xx表示接收机不从nals“xx xx xx xx xx xx xx xx xx 00 00 00 01 xx xx xx xx xx xx”中删除的额外信息。首先,不必通过RTP传输起始代码。这就是为什么您仍然需要通过RFC并与流进行比较。你还看到启动码吗?您的设备可能出于某种原因发送它们,可能是由于错误。检查这个,这是一个SEI NAL RTP数据包的开始,没有开始代码,它是一个有效流。我的意思是,在RTSP接收器采集数据后,如果h.264编码器不需要,为什么这些数据会保留下来?!恐怕我还是没有领会你的意思。您的问题是关于RTSP/RTP,RTP运营商不使用起始代码。RTSP/RTP客户端可以使用开始代码来重建H.264流,也可以选择不使用它(例如,在Windows中,DirectShow AVC1媒体类型是没有开始代码的H.264视频)。如果您在RTP中看到这些代码,那么出于某种原因,发送方会包含它们。如果它们不在线路上,RTSP接收器添加它们,那么它与RTP无关。H.264编码器生成NAL,RTP广播器有时接收整个NAL,有时接收整个段