Skip to content

RTP

相关术语

  • FEC: Forward Error Correction 前向纠错。将k bit信息分组编码,加入n-k个冗余校验信息,接收端可通过校验信息进行纠错,降低系统误码率、 延长传输距离。
  • NACK: Non-Acknowledge,于ACK相反,当未收到某网咯包时发送未收到通知(具体发送判定机制具体看实现)接收端通过RTCP将丢包的序列号通知给发送端,让发送端重传该包。
  • RTX: 与上面的NACK合一起是webrtc的丢包重传策略。发送端在新的SSRC上发送重传包或者冗余包。

H264

其中payload type为96的是h264,其中的payload数据

  • 第一个字节是FU-Identifier,|F(1)|NRI(2)|Type(5)|,其中NRI值越大标识该nalu越重要
  • 第二个字节是FU-Header,|S(1)|E(1)|R(1)|Type(5)|,其中S表示起始分片,E表示最后一个分片,R是保留位,Type是对应的h264的naluType。
  • 后续的字节是h264除去nalutype的数据,通过前两个字节对nalu进行重构(以及添加startcode)

解析时,先获取第一个字节的后五个bit,这5 bit表示意思

Payload Type Packet Type
0 reserved
1-23 NALU unit(单包即是一个h264的nalu数据)
24 STAP-A(这个见过)
25 STAP-B
26 MTAP16
27 MTAP24
28 FU-A(这个见过)
29 FU-B
30-31 reserved

如果是1-23直接第一个字节的后五位就是h264的naluType了。其他的如FU-A(28),则nalu是第一个字节的前3个bit和第二个字节的后5个bit。注意这只是 获取到了nalu,还应根据第二个字节的S bit是否为1,对应插入0x00000001的startcode(1~23的无脑插0x00000001)。

Nalu

8字节: (1bit禁止位) + (2bit优先级位) + (5bit naltype)

  • naltype:
  • 1: 非IDR的一个slice
  • 5: IDR
  • 6: SEI
  • 7: SPS,序列参数集帧,包括视频编码的分辨率、帧率、色彩空间等(ts流中idr帧前发送sps)
  • 8: PPS,图像参数集帧,包括码率、量化参数、参考帧(ts流中非idr帧前发送pps)
  • 9: AUD(Access Unit Delimiter 访问分隔符),表示nalu的分界符,用于解码器接收到nalu时正确的解码和处理。

打包es层数据时pes头和es数据之间要加入type为9的nalu,关键帧slice前必须插入type=7的sps和tpye=8的pps。

  • 防止竞争(emulation prevention)机制: h264在编码时,在每个nalu前加起始码(0x00000001/0x000001,4字节的startcode表示1帧开始)。为防止nal内部出现0x000001数据,在编码nal时,若 检测到有连续两个0x00字节,就在后面插入一个0x03

AAC

payload为97且是MEPG4-GENERIC的是aac,其中除去含有ssrc、pt、(可能有的csrc)等信息的rtp header后的payload是有AU header的。

其中首先是前两个字节表示AU-headers-length(单位是bit),如00 10表示Au-header占用16个bit,而Au-header结构为|Au-size|Au-index/Au-index-delta|CTS-flag|CTS-delta|DTS-flag| DTS-delta|RAP-falg|Stream-state|前三个由sdp中发过来的对应的三个字段决定,剩余的值都是可选的(看sdp中是否出现且是否不为0)

疑惑:有些sdp中发了index_delta,但还是默认把au-header大小计算时没带上delta,不懂是为什么(关键是还能正常用)

ADIF

音频数据交换格式(Audio Data Interchange Format),常用于磁盘文件中。header + raw_data

ADTS

音频数据传输流(Audio Data Transport Stream),有一个同步字的bit流。

  • ADTS头长度可能为7字节或9字节。分为两个域adts_fixed_header(28bit)和adts_variable_header(28bit),fixed中protection_absent(错码校验)为0时9字节, 为1时7字节。
  • fixed_header的前12个bit为syncword(同步头),总是0xFFF,表示一个ADTS帧的开始。该固定头每帧都相同,包含AAC音频级别、采样率、声道信息。
  • variable_header包含帧长度的信息(13bit)和adts_buffer_fullness(为0x7ff表示码率可变)