参考文献
- H264码流RTP封装方式详解:https://blog.csdn.net/water1209/article/details/126019272
- H264视频传输、编解码----RTP协议对H264数据帧拆包、打包、解包过程: https://blog.csdn.net/wujian946110509/article/details/79129338
- H264之NALU解析: https://zhuanlan.zhihu.com/p/409527359
H264数据打包成RTP数据的方式
注意:H264帧数据打包进入RTP packet时会把start code(00 00 00 01 或者00 00 01)去掉,所以RTP payload部分第一字节就是H264 NALU Header部分。
H264 NALU(Network Abstract Layer Unit)组成
H264帧是由一系列的NALU组成,NALU Header由一个字节组成,它的语法如下:
+---------------+|0|1|2|3|4|5|6|7|+-+-+-+-+-+-+-+-+|F|NRI| Type |+---------------+
F: 1个比特. forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.禁止位,0表示正常,1表示错误,一般都是0;
NRI: 2个比特. nal_ref_idc. 取00~11,表示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放.
Type: 5个比特,重要 nal_unit_type. 这个NALU单元的类型.简述如下:
Type Packet Type name ---------------------------------------------------------0 undefined -1-23 NAL unit Single NAL unit packet per H.264 24 STAP-A Single-time aggregation packet 25 STAP-B Single-time aggregation packet 26 MTAP16 Multi-time aggregation packet 27 MTAP24 Multi-time aggregation packet 28 FU-A Fragmentation unit 29 FU-B Fragmentation unit 30-31 undefined
之前提到过,单个H264仅用1-23类型,24以及以后的用在RTP协议中 H264数据的头部,用于标识传输过程中H264的类型。
H264封包过程
对于一个原始的 H.264 NALU 单元常由 [Start Code] [NALU Header][NALU Payload] 三部分组成, 其中 StartCode 用于标示这是一个NALU 单元的开始, 必须是 “00 00 00 01” 或 “00 00 01”, NALU 头仅一个字节, 其后都是NALU 单元内容.打包时去除 “00 00 01” 或 “00 00 00 01” 的开始码, 把其他数据封包的 RTP 包即可.
根据H264 NALU的数据长度和MTU(底层限制最大1500字节)进行比较的结果,RTP有三种打包模式:单一NALU模式、组合封包模式、分片封装模式。
封包的代码实现可参考:https://github.com/hmgle/h264_to_rtp
单一NALU模式
对于NALU的长度小于MTU大小的包,一般采用单一NALU模式: