我对RTP数据包中的帧边界几乎没有疑问。
首先,如果标记位已设置,是否表示已开始新帧(这是我从RFC 3551中理解的)?
其次,根据我读到的内容,帧以I帧开始,后跟P,B帧。现在,哪个字段表示这个?并且I帧是否设置了标记位?
第三,如果我需要找到一个帧的开始和结束,检查标记位是否足够?
谢谢!
答案 0 :(得分:1)
RTP entry on the Wireshark Wiki提供了大量信息,包括(修改)sample captures。你可以对它进行研究,它可能会回答你的一些问题。如果您要编写代码来使用RTP,Wireshark对于监视/调试非常有用。
修改关于标记位的第一个问题,此FAQ可能有所帮助。此外,找到帧(I,P,B)取决于有效载荷。还有另一个question here有一个答案显示我是如何找到MPEG,P,B的。 h263-over-rtp.pcap包含用于H.263的I帧和P帧的示例。
答案 1 :(得分:0)
这是一个老问题,但我认为这是一个好问题。
正如您提到的 I、P 和 B 帧,在 2012 年,您可能指的是 H.264 over RTP。
根据 [rfc6184]1 ,标记位设置在帧的最后一个数据包上,因此标记位确实可以用作 1 帧结束的指示符和顺序的下一个数据包将是下一帧的开始。
根据这个 rfc,一个帧的所有数据包也有相同的 RTPTIME,所以 RTPTIME 的变化是前一帧结束和新帧开始的另一个指标。
当您丢失数据包时,事情会变得更加棘手。例如,假设您丢失了第 5 和第 6 个数据包,并且它们是第 1 帧的最后一个数据包和第 2 帧的第一个数据包。您知道丢弃第 1 帧,因为您从未获得带有该帧标记位的数据包,但是你怎么知道第 2 帧是完整的还是不完整的。也许这两个丢失的数据包都是第 1 帧的一部分,还是第二个数据包是第 2 帧的一部分?
rfc6184 定义了出现在分片 NAL 单元的第一个数据包中的起始位。如果 NAL 单元没有被分片,那么根据定义,如果我们得到了数据包,我们就得到了整个 NAL 单元。这意味着我们可以知道我们是否有一个完整的 NAL 单元。不幸的是,这并不能保证我们拥有完整的帧,因为一帧可能包含多个 NAL 单元(例如多个切片),而我们可能已经丢失了第一个。我没有解决这个问题的方法,但也许有人会在未来 10 年的某个时候提供一个。