H.264编码基本原理
为达到良好的编码效率及性能,H.264编码器采用的仍是变换和预测的混合编码法,其完整的编码过程如图所示。
在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/AVC是目前业界应用为广泛的视频压缩编码标准,包含了先进而且较为成熟的视频编码技术。本课程将从原理、标准和实现等多个角度,详细讲述了H.264/AVC视频编码标准的整体架构与技术细节,不但讲解了H.264/AVC标准协议文档中的内容,还通过实际的H.264码流分析/解码程序的开发来帮助观众更深入地理解H.264编码标准的原理。
H.264数据流格式
H264码流的两种打包方式,一种为Annex-b byte stream format的格式,字节流格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_code,0x00000001或者0x000001,即NALU数据+开始前缀(00000001或000001),针对H.320电话会议。另一种是原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编码器的profile,level,PPS,SPS等信息才可以解码。
RTP格式:NALU数据+20个字节的类似的并不符合RTP协议的RTP头。针对IP网络的RTP打包方式。为原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编码器的profile,level,PPS,SPS等信息才可以解码。
H.264协议只规定了字节流格式,没有规定 RTP 格式。可能也是因为这个原因,JM 的 RTP 格式没有被用到任何场合场合中,成为了摆设。
一共有两种起始码:3字节的0x000001和4字节的0x00000001
3字节的0x000001只有一种场合下使用,就是一个完整的帧被编为多个slice的时候,包含这些slice的nalu使用3字节起始码。其余场合都是4字节的。
H.264 的两种码流格式:
GetAnnexbNALU 处理字节流格式的码流
GetRTPNALU 处理 RTP 格式码流
字节流格式的码流主要用于存储,例如制作 DVD(当然现在的 DVD 还不是用 H.264)
RTP 格式码流主要用于网络传送,例如在线看电影
最简单RTP包包括RTP包头、H.264扩展头和H.264码流
码流在JM里会首先打包到NALU里去,之后要把NALU中的相关信息变成H.264扩展头,然后再加上一个RTP包头,就变成了一个RTP包。
H.264扩展头就一个字节,三个信息。
RTP包头12和16字节两种,JM都先读四个字节,再读四个字节时间戳,再就是buffer,之后还有四个字节的信息源标识符,一共12字节才对。