首页 > 其他分享 >H264码流的RTP封装

H264码流的RTP封装

时间:2024-11-09 15:58:48浏览次数:1  
标签:码流 00 FU SEQ H264 RTP NALU 0x1f

一、RTP协议头:

1.RTP头定义:

RTP协议头一般固定为12个字段,在每一个RTP数据包中都存在。各字段的含义如下:

version(V):2bits:标识RTP的版本,当前协议版本固定为2.

padding(P):1bits:填充位。默认0,如果为1,则在该报文的末尾填充一个或多个额外的八位组,它们不是有效载荷的一部分。某些具有固定块大小的加密算法可能会使用到填充

extension(X):1bits:扩展位。默认0,如果为1,设置了扩展位,固定头部必须紧跟一个头部扩展。

CSRC count(CC):4bits:CSRC计数器。默认为0,指示CSRC标识符的个数。

marker(M):1bits:不同的载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。

payload type(PT):7bits:载荷类型。常见的H264视频为96,AAC音频为97

sequence number(SEQ):16bits:序列号。用于标识发送者发送RTP报文的序列号,每次加1,初始值应该是随机的。接收方可以用于检测丢包,或者重排。音频包和视频包是分别计数的。

timestamp:32bits:时间戳。反映RTP数据包中第一个八位字节的采样瞬间,接收者可以用来计算延迟和延迟抖动,结合RTCP包的NTP时间基等概念,接受端可以进行音视频同步控制(以后再深入学习)

ssrc:32bits:同步信源标识。该标识符应当是随机选择的,且同一RTP会话中不同同步源需要有不同的ssrc标识符。

csrc list:0~15个32bits:特约信源。标识符的个数由CC字段给出,一般在混音器插入时才出现,默认不需要。

2.ZLM中关于H264流RTP的构造:

 二、RTP封包类型:

H264可以由三种RTP打包方式:1)单NALU打包,一个RTP包包含一个完整的NALU;2)聚合打包,对于较小的NALU,一个RTP包可以包含多个完整的NALU;3)分片打包:对于较大的NALU,一个NALU可以分为多个RTP包发送。比较常见的是单NALU打包和分片打包。

 单NALU打包简单,将整个NALU的数据放入到RTP包的载荷中即可。

 分片打包。在RTP载荷开始之前有两个字节的信息,然后是NALU的内容。

 第一个字节是FU Indicator。标识封包类型。格式如下:F禁止位,NRI两个bite,Type为封包类型。解析方法:futype = fu_indicator & 0x1f;

 第二个字节是FU header。用于判断包的位置,和包的类型。FU-A打包中的第一个包时,S设为1;FU-A打包的最后一个包时,E设为1;R为保留位。Type为原来NALU的Type的低位,0x01,0x05,0x07,0x08这些

 H264帧的NALU TYPE类型:nal_fu = (fu_indicator & 0xe0) | (fu_header & 0x1f)

在ZLM中使用到的RTP分别类型有3种:Single包、STAP-A包、FU-A包。

 三。STAP-A包

1.STAP-A包的完整格式:

 2.SPS帧抓包:

 

其中:80 60 31 4a 00 57 40 e0 00 00 00 02为RTP HEAD,对照RTP HEAD定义可以进行解析。可以得出PT为96,SEQ为12618,Timestamp为5718240,SSRC为000002

剩余部分:78 00 18 67 64 ......

78 -->0111 1000。0x78 & 0x1f = 0x18 。后5位type为24。表示为STAP-A类型包

00 18 载荷长度:24

67 -->NALU TYPE表示为SPS包

之后的内容是SPS包的具体内容,不再分析。

3.PPS帧抓包:

 其中:80 60 31 4b 00 57 40 e0 00 00 00 02为RTPHEAD, 可以得出PT为96,SEQ为12619,Timestamp为5718240,SSRC为000002。对比SPS包可以看出,SEQ加1,同一时刻构造的包,SSRC一致。

剩余部分:78 00 05 68 ee 31 b2 1b

78 -->0111 1000。0x78 & 0x1f = 0x18 。后5位type为24。表示为STAP-A类型包

00 15 载荷长度:5

68 -->NALU TYPE表示为PPS包。

之后的内容是PPS包的具体内容,不再分析

四、FU-A包

1、FU-A包完整格式:

 2、I帧(起始帧)抓包

 

其中:80 60 31 4c 00 57 40 e0 00 00 00 02为RTPHEAD, 可以得出PT为96,SEQ为12620,Timestamp为5718240,SSRC为000002。对比SPS包可以看出,SEQ加1,同一时刻构造的包,SSRC一致。

剩余部分:7c 85 b8 ...

7c --> 0111 1100。0x7c & 0x1f = 0x1c。后5位type为28表示为FU-A类型包

85 -->1000 0101。对比FU Head解析,S为1,说明是起始包。后5位为5,说明是I帧。更加完整的NAL TYPE为:(0x7c &  0xe0) | (0x85 & 0x1f) = 0x65

之后的内容是NALU负载,不再分析

3、I帧(中间帧)抓包

 

其中:80 60 31 4d 00 57 40 e0 00 00 00 02为RTPHEAD, 可以得出PT为96,SEQ为12621,Timestamp为5718240,SSRC为000002。对比SPS包可以看出,SEQ加1,同一时刻构造的包,SSRC一致

剩余部分:7c 05 ad ...

7c --> 0111 1100。0x7c & 0x1f = 0x1c。后5位type为28表示为FU-A类型包

05 -->0000 0101。对比FU Head解析,S为0,E为0,说明是中间包。后5位为5,说明是I帧。更加完整的NAL TYPE为:(0x7c &  0xe0) | (0x05 & 0x1f) = 0x65

之后的内容是NALU负载,不再分析

4、I帧(结尾帧)抓包:

 

其中:80 e0 31 db 00 57 40 e0 00 00 00 02为RTPHEAD, 可以得出PT为96,SEQ为12763,Timestamp为5718240,SSRC为000002。对比SPS包可以看出,SEQ加了很多,同一时刻构造的包,SSRC一致

剩余部分:7c 05 ad ...

7c --> 0111 1100。0x7c & 0x1f = 0x1c。后5位type为28表示为FU-A类型包

45 -->0100 0101。对比FU Head解析,S为0,E为1,说明是结尾包。后5位为5,说明是I帧。更加完整的NAL TYPE为:(0x7c &  0xe0) | (0x45 & 0x1f) = 0x65

之后的内容是NALU负载,不再分析

至此一个完整的I帧结束

5、P帧(分包)抓包

 

其中:80 60 31 f2 00 58 83 9c 00 00 00 02为RTPHEAD, 可以得出PT为96,SEQ为12786,Timestamp为5800860,SSRC为000002。对比SPS包可以看出,SEQ加了很多, 时间戳增加,SSRC一致

剩余部分:7c 81 e2 ...

7c --> 0111 1100。0x7c & 0x1f = 0x1c。后5位type为28表示为FU-A类型包

81 -->1000 0001。对比FU Head解析,S为1,E为0,说明是起始包。后5位为1,说明是P帧。更加完整的NAL TYPE为:(0x7c &  0xe0) | (0x81 & 0x1f) = 0x61

五、ZLM对RTP的封装实现:

1、根据H264帧的长度,决定单包还是分包:

 2、对于单包,zlm根据配置分别采用单nalu和stap-a两种方式:

 3、singlenalu打包:直接将NALU内容放在RTP头后面

 4、stap-a打包:作者注释是为了兼容性webrtc。第一个字节为0x24,第二和第三字节为负载长度,后面为NALU内容

5、fu-a打包:设置第一个字节为28,第二个字节有NALU的TYPE和起始结束标识进行构造。在while循环中进行分包处理。

 六、ZLM对RTP的解封装实现

1、根据RTP头部之后的第一个字节判读包类型:nal = frame[0] & 0x1f。其中小于24为单包,24为stap-a,28为su-a,其它不支持

 2、解封装单包:在负载内容frame之前添加帧分隔符00 00 00 01,组装成H264裸帧

 3、解封装stap-a包:stap-a包和单包类似,只不过多了两个字节表示载荷长度,可用于包长度校验。取出nalu载荷之后通上述单包逻辑,组成成H264裸帧。

 

4、解封装fu-a包:根据RTP头后面的第二个字段,可以判断出是起始/中间/结尾包。根据第一个和第二个字段可以计算出H264帧的类型。如果是起始包,添加00 00 00 01帧头,添加帧类型,缓存后续包;如果是中间包,缓存第二个字节之后的后续包;如果是结尾包,缓存第二个字节之后的后续包之后,至此组装出一个完整的H264裸帧。在分包缓存的过程中根据SEQ序号还就行了帧连续性判断

 

标签:码流,00,FU,SEQ,H264,RTP,NALU,0x1f
From: https://www.cnblogs.com/feixiang-energy/p/18525281

相关文章

  • AFL++实战入门与afl-fuzz流程解析(源码流程图)
    简介本项目为模糊测试的零基础教学,适合了解pwn且会使用Linux的gcc、gdb的读者。模糊测试旨在通过向程序投喂数据使其崩溃,从而获取崩溃样本以寻找程序漏洞。本文前半部分介绍AFL++的docker环境配置,帮助读者解决入门时的环境和网络问题;后半部分全面解析afl的模......
  • springmvc请求源码流程解析(二)
        Spring官网的MVC模块介绍:SpringWebMVC是基于ServletAPI构建的原始Web框架,从一开始就已包含在Spring框架中。正式名称“SpringWebMVC”来自其源模块的名称(spring-webmvc),但它通常被称为SpringMVC。    从Servlet到SpringMVC:    最典型的MVC就是J......
  • ISUP协议视频平台EasyCVR视频分析设备平台浅述什么是分辨率,帧率,码流,码率
    在视频监控行业中,技术参数是衡量监控系统性能的重要指标。对于刚进入该领域的新手来说,一些基础概念如分辨率、帧率和码流可能会让人感到困惑。这些参数不仅决定了视频图像的清晰度和流畅度,还直接影响到存储和网络传输的需求。为了确保新入行的视频监控行业同仁能够快速掌握这些......
  • H264解析
    一、从视频图像角度看:H264->GOP->Frame->Slice->Block序列(GOP)图片(pictrue)片(Slice)宏块(Macroblock)子块(subblock)GOP(GroupofPicture)组成:两个I帧之间的所有帧为一个GOP。1个GOP=1个I帧+若干个B帧+若干个P帧I帧、B帧、P帧I帧Intrapicture帧内编码帧。......
  • PALMS: Plane-based Accessible Indoor Localization Using Mobile Smartphones
    arxiv|加州大学待开源PALMS:使用移动智能手机的基于平面的无障碍室内定位【PALMS:Plane-basedAccessibleIndoorLocalizationUsingMobileSmartphones】文章链接:[2410.15694]PALMS:Plane-basedAccessibleIndoor...项目主页:https://github.com/Head-inthe-Cloud/......
  • 从零开始精通RTSP之深入理解RTP协议
    一、RTP协议概述1.定义   RTP(RealTimeTransportProtocol)即实时传输协议,它是一种用于在IP网络上对多媒体数据进行实时传输的标准协议。在RTSP(RealTimeStreamingProtocol)的应用场景中,RTP起到了至关重要的作用,负责传输实际的音视频数据。2.协议结构   RTP头部......
  • kamailio+rtpengine安装部署
    融合通信平台安装部署1、环境说明序号IP系统版本cpu内存硬盘1172.27.54.65Ubuntu22.04.4LTS8c16G200G2172.27.54.66Ubuntu22.04.4LTS8c16G200G安装中文语言包,并修改字符集为中文aptinstalllanguage-pack-zh-han*-yupdate-localeLANG=zh_CN.UT......
  • 通过码流串,格式为key,len,val。提供key,查找val的算法。
    1importjava.util.ArrayList;2importjava.util.HashMap;3importjava.util.UUID;45publicclassHuaweiTest{67publicstaticvoidmain(String[]args){8//System.out.println("HelloWorld!");9Strin......
  • 通过码流串,格式为key,len,val。提供key,查找val的算法。
    importjava.util.ArrayList;importjava.util.HashMap;importjava.util.UUID;publicclassHuaweiTest{publicstaticvoidmain(String[]args){//System.out.println("HelloWorld!");Stringtag="31";Stri......
  • lowflow-design:低代码流程设计器,让流程搭建更简单!
    嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法简介lowflow-design是一个基于Vue3、Vite、TypeScript、Element-Plus等技术栈开发的,适用于低代码或无代码开发平台的流程设计器。它让普通人也能通过简单配置快速搭建流程,并提供了将j......