图像编码方式
H264支持三种图像编码方式:帧编码、场编码、帧场自适应编码。
- 帧编码容易理解,表示将一帧图像划分为16x16大小宏块进行编码,这种方式编码图像中所有宏块都是帧宏块
- 场编码,将一帧图像根据奇数行和偶数行划分为两部分,分别成为顶场和底场,如下图所示。这种方式编码的slice中所有宏块都是场宏块。
- 宏块级帧场自适应编码,这种方式以宏块对方式编码,它的自适应性体现在:宏块对可以是帧宏块对也可以是场宏块对。编码过程中先编码顶宏块再编码底宏块,编码完一个宏块对后再编码下一个宏块对。
码流编码方式
基于以上三种图像编码方式,一段H264码流(多帧图像)的编码方式有以下几种:
- 全部图像采用帧编码
- 全部图像采用场编码,每帧图像分为两场:
1)I帧可编码为两个I场或一个I场和一个P场
2)P帧可编码为两个P场或一个P场和一个B场;
3)B帧可编码为两个B场 - 图像级帧场自适应(PAFF),视频序列中有些帧被编码为帧格式,有些帧被编码为场
- 有些图像编码为宏块级帧场自适应,有些图像被编码为场格式
如何区分图像到底使用哪种编码方式
每帧图像使用哪种编码方式再H264语法中已经定义,按照下面流程就可以解析得到编码方式。
判断过程需要用到如下三个参数:
sps中的frame_mbs_only_flag和mb_adaptive_frame_field_flag,以及slice header中的field_pic_flag。
frame_mbs_only_flag:1表示序列中只有帧宏块;
mb_adaptive_frame_field_flag:1表示视频序列中可能存在MBAFF;
field_pic_flag:表示该slice是场编码
- frame_mbs_only_flag=1时,视频序列中所有图像都是帧格式;
- frame_mbs_only_flag=0 && mb_adaptive_frame_field_flag=0时,视频序列可能是全部是场格式,也有可能是PAFF,需要根据每一帧的field_pic_flag判断;
- mb_adaptive_frame_field_flag=1&& field_pic_flag=1时,表示该slice为场;
- mb_adaptive_frame_field_flag=1&& field_pic_flag=0时,表示该帧为MBAFF