H.264/ACC音视频编码流的RTP/RTSP传输实现(二)

H.264/ACC音视频编码流的RTP/RTSP传输实现(2)

H.264编码基本原理
  为达到良好的编码效率及性能,H.264编码器采用的仍是变换和预测的混合编码法,[[[] 毕厚杰. 新一代视频压缩编码标准: H. 264/AVC[M]. 人民邮电出版社, 2005]]其完整的编码过程如图2-1所示。
  在H.264编码标准中,输入的帧或场Fn是以宏块为单位进行处理的,采样后的视频图像都被分成16*16的宏块每个宏块包括1个亮度子块和2个8*8的色度子块。在分割宏块后,宏块按照相应次序进行编码器进行压缩编码。在H.264编码过程中,首先按照根据编码速率、编码质量等标准指定的算法,选择按照帧内编码或帧间预测编码的方法进行宏块压缩编码。
  若采用帧内预测编码,其预测值 PRED(图中用P 表示)是由当前片中前面已编码的图像得到的;若采用帧间预测编码,则预测值PRED是由当前帧前后已编码的图像经过运动补偿得到的。其中参考图像用 F’n-1表示。为了提高预测精度,从而提高压缩比,实际的参考图像可在过去或未来(指显示次序上)已编码解码重建和滤波的帧中进行选择。
  在通过相应算法得到当前宏块(子宏块)的预测值后,将预测值PRED 和当前宏块的色度或亮度值相减,产生一个残差块Dn,经宏块DCT变换、量化后将产生一组量化后的亮度或色度变换系数X,再经过熵编码过程,加上解码所需的一些信息(如预测模式量化参数、运动矢量等),将其一起组成一个压缩后的NAL码流,经NAL(网络自适应层)供传输和存储使用。如上所述,为了提供下一步预测要用的参考图像,编码器必须有重建图像的功能,对当前宏块进行重建。因此必须使残差图像经反量化、反DCT变换后得到的 Dn’与预测值P 相加,得到 uFn’(未经滤波的帧)。为了去除编码解码环路中产生的噪声,为了提高参考帧的图像质量以及提高压缩图像性能,设置了一个环路滤波器对相应图像进行滤波处理,滤波后的输出Fn’即重建图像可用作参考图像。
H.264/ACC音视频编码流的RTP/RTSP传输实现(二)

H.264编码数据格式
  H.264具有良好的网络亲和性,即可适用于各种传输网络。为此,H.264的功能分为两层,即视频编码层(VCL)和网络提取层(NAL,Network Abstraction Layer)。VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元中。
  NAL层中的结构主要包括:编码视频序列(Coded Video Sequence)、接入单元(AccessUnit)、NAL单元,相互之间的关系如图
H.264/ACC音视频编码流的RTP/RTSP传输实现(二)
  H.264语法单元被封装成原始直接字节序列载荷(RBSP),加上一组对应于视频编码数据的NAL头信息被封装成网络抽象层单元(NALU)。NALU单元序列结构如图2-3,NAL则是为了格式化数据,并适用于存储介质或在多种通信信道上传输的格式提供头信息。
H.264/ACC音视频编码流的RTP/RTSP传输实现(二)
  NAL单元中包含了所有的数据,每个NAL单元都包含整数字节。一个RBSP将通过增加一个NALU头部封装成NALU。由于NAL单元式紧密排列的,每个NALU前都必须插入相应的起始码前缀(四字节的十六进制码0x00000001或三字节的十六进制码000001),以区分出每个NAL单元。如果NAL码流中出现起始前缀,必须在NALU中插入一个字节防止二义的数据码(0x03),过程如表2-1。当解码器检测到一个预防二义数据码(0x03)时,将去除这样的数据码,以防止解码器将其作为负载码流进行解码。一个NALU可以通过一个传输协议来传输,NALU将作为一个传输包中的负载;NALU也可以通过字节流来传输。
H.264/ACC音视频编码流的RTP/RTSP传输实现(二)
  在NALU头信息中包含3个字段Type、NRI 、F。其中F为禁止位(Forbidden ),占用1比特;NRI为重要性指示位,占用2比特;Type为数据载荷类型,占用5比特。NALU头信息结构如表2-2 所示:
H.264/ACC音视频编码流的RTP/RTSP传输实现(二)
  F: forbidden_zero_bit,H.264规定应为0。当接收端或解码器发现此标志位为1则说明出现错误。该字段在网络传输等应用中非常有用。对于某些解码器,可以处理遇到的这些错误。
  NRI: nal_ref_idc,表示该NALU的重要程度,值越大表示该NALU越重要,对解码后的视频效果的影响越大。例如00表示该NALU是不太重要的信息(如码流结束、序列结束等信息)。11则表示该NALU信息非常重要(如序列参数集SPS、图像参数集PPS等)。
  Type:nal_unit_type,是指包含在NAL单元中的RBSP 数据结构的类型,标志该NALU属于32种NALU类型中的哪一种。VCL NAL单元是指那些nal_unit_type 值等于1 到5(包括1 和5)的NAL单元,如IDR图像。所有其他的NAL单元都称作非VCL NAL单元。各NALU的类型及意义如表2-3所示
H.264/ACC音视频编码流的RTP/RTSP传输实现(二)