SIP视频通话或会议中,通常以H264作为视频编码,通过RTP进行传输。这部分应用以RFC3984为标准规范。
rfc3984: RTP Payload Format for H.264 Video
H264中一些概念:
SPS: sequence parameter set 序列参数集,包含图像大小、编码模式等参数
PPS: picture parameter set 图像参数集
IDR: Instantaneous Decoding Refresh I帧,立即刷新,是一幅可以完整显示的画面
GOP:Group of Pictures 画面组,一组GOP就是一组连续的画面。
GOP序列如下:
1. 首先是参数集信息开始如SPS,PPS,SEI(可选)
2. 第一帧是I帧(IDR),解码后立即显示的画面,即首屏画面,
3. 接下来是P帧或B帧
视频通话就是依靠一组一组的GOP画面构成的。两个GOP之间的间隔时间即I帧间隔。
H.264编码分为两层
VCL (Video Coding Layer,视频编码层):视频编码压缩后的数据序列
NAL(NetworkAbstraction Layer,网络提取层):对数据进行打包
使用NAL打包的每一个数据单元,称为NALU( Network Abstraction Layer Unit),NALU头由一个字节表示,如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
F: 禁止位, 正常为0, 如果是1表示错误,解码器需要丢掉该数据
NRI: 参考指示位, 表明是否用来重构参考图像的数据, 值为00的数据不是用来重构参考图像的,可以丢弃。大于00的数据则不可以丢弃
TYPE:类型,如下
0:未规定
1:非IDR图像中不采用数据划分的片段
2:非IDR图像中A类数据划分片段
3:非IDR图像中B类数据划分片段
4:非IDR图像中C类数据划分片段
5:IDR图像的片段
6:补充增强信息 (SEI)
7:序列参数集/SPS
8:图像参数集/PPS
9:分割符
10:序列结束符
11:流结束符
12:填充数据
13 – 23:保留
24 – 31:未规定
H264 三种封包格式:
1. Single NAL unit mode 单NALU模式, SDP协商参数中packetization-mode=0或者没有该参数,所有的接收者必须支持这个模式
2. Non-interleaved mode 非交替式, SDP协商参数中packetization-mode =1, 单NALU包, STAP-As,FU-As 可以使用这种模式
3. Interleaved mode 交替式, SDP协商参数中packetization-mode =2, STAP-Bs, MTAPs, FU-As, FU-Bs 可以使用这种模式, STAP-As和单NALU包必须不能使用
示例如下(SDP描述):
RTP报文有三种封包格式:
1、单一NALU模式
2、组合封包模式(STAP-A, STAP-B, MTAP-A, MTAP-B)
3、FU分片封包模式(分为FU-A和FU-B两种)
RTP头域中M位: 标记一帧数据的结束
RTP承载H264报文如下。
关键说明:
- H264没有固定的RTP负载类型, 一般使用动态类型(96~127),常用数值有96、97、98、99等
- 接收方收到RTP数据时,一般按照RTP包的序列号顺序重组后送进解码器解码,这里要注意到RTP包序列号是16位,最大值为65535,超过该值会环绕成0, 在排序时要特别注意。序列号也是定位丢包的重要依据