引用chatgpt内容作答:
根据您的描述,您提到了两个不同的方式来封装 H.264 数据并发送 RTP 包,一个是将 H.264 数据直接切分成多个 1400 字节的数据,另一个是使用 Fragmentation Units Type A (FU-A) 进行分片。让我为您解释一下这两种方式。
1、直接切分数据: 这种方式没有使用 FU-A 分片,而是将 H.264 数据直接切分成多个 1400 字节的数据块,然后将这些数据块放入 RTP 包中发送。这种方式没有使用特定的 RFC 文档,而是可能是一种特定应用场景下的自定义方式。不同的应用可能会根据自身需求和传输环境来采用这种方式。
2、FU-A 分片: 采用 H.264 视频帧的分片方式是根据 RFC 3984 中的建议进行的。FU-A 是 Fragmentation Units Type A 的简写,它是一种将大的 H.264 帧切分成多个较小的分片进行传输的方法。每个 FU-A 分片都有一个特定的头部,其中包含了一些关键信息,如分片的开始标志、结束标志、NAL 单元类型等。这种方式的优点在于它能够适应网络状况的变化,并能够更灵活地进行传输和重组。这个方式在实时传输协议(RTP)中被广泛使用。
从您的描述来看,第一种方式可能是一种特定场景下的自定义实现,而第二种方式则更符合标准的 RTP 和 H.264 分片协议。您可以根据您的应用需求和网络环境选择适合的方式来进行数据封装和传输。
对于大于MTU大小的H.264视频数据在RTP over UDP中进行封装传输,RFC 3984提供了Fragmentation Units (FUs)的分片机制。
RFC 3984 中规定,如果RTP payload大小大于MTU,则发送端需要将其拆分为多个FUs进行传送。每个FU都需要加上FU indicator和FU header。
FU indicator有两种:
- FU-A - 用于非起始FU,表示后续FU段。
- FU-B - 用于起始FU,表示后续FU的开始。
FU header包含FU payload的信息,如起始位和结束位等。
所以正确的做法应该是:
将大块H.264数据拆分成多个FU payloads,每个在MTU以下。
对起始FU payload加上FU-B indicator 和 FU header。
对后续非起始FU payload加上FU-A indicator 和 FU header。
每个FU payload都作为RTP payload发送。
直接切割H.264数据,不加FU indicator和header,然后打包成RTP发送是不符合RFC 3984要求的。这种方式接收端无法区分FU的边界,无法还原原始H.264数据。
所以您看到的直接切分H.264并RTP发送的方案,是不规范的实现,不建议使用。应该按RFC 3984实现FU的细粒度分片,以便接收端能够正确解析和还原H.264视频流。