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