lijunbiao2080 2023-08-07 18:38 采纳率: 50%
浏览 25
已结题

rtp封装h264的问题

GB28181的TCP码流遵循的标准是RFC4571(RTP OVER TCP):2字节长度+rtp或者rtcp packet
RTSP中tcp码流是遵循的RFC2326标准 :1字节的$符号+1字节的channel number + 2字节长度+rtp或者rtcp packet

udp直接通过一个端口发送rtp packet,国标ps流就是采用的音频视频流一个端口发送的
或者通过rtsp中的音频、视频两个端口分开发送的方式。

rfc3984中对于大于mtu的报文采用分片的方式发送h264, h265数据,这些都有rfc文档说明的

我的问题是:我看到有的报文采用的是直接h264原始数据切分成多个1400自己的数据,然后直接udp rtp packet发送,例如:h264基本数据为0x00 00 00 01 27 33 44 55 66 77 88 99 10,直接切分rtp header + 0x00 00 00 01 27 33 44; rtp header + 55 66 77 88 99 10;没有进行fu-a的分片,直接发送基本流,请问采用的那个rfc文档?并给出解释?

  • 写回答

13条回答 默认 最新

  • 2301_79233340 2023-08-07 19:08
    关注

    引用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的信息,如起始位和结束位等。

    所以正确的做法应该是:

    1. 将大块H.264数据拆分成多个FU payloads,每个在MTU以下。

    2. 对起始FU payload加上FU-B indicator 和 FU header。

    3. 对后续非起始FU payload加上FU-A indicator 和 FU header。

    4. 每个FU payload都作为RTP payload发送。

    直接切割H.264数据,不加FU indicator和header,然后打包成RTP发送是不符合RFC 3984要求的。这种方式接收端无法区分FU的边界,无法还原原始H.264数据。

    所以您看到的直接切分H.264并RTP发送的方案,是不规范的实现,不建议使用。应该按RFC 3984实现FU的细粒度分片,以便接收端能够正确解析和还原H.264视频流。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 赞助了问题酬金15元 8月7日
  • 赞助了问题酬金15元 8月7日
  • 创建了问题 8月7日

悬赏问题

  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思