一、基本概念
1、编码顺序
H.264的码流输出顺序便是编码顺序,所以在编码B帧的时候,由于B是双向预测,需要先编码后面编码帧P/I,这时候先输出I/P,后面才有B帧,我们在解码段拿到相应的I/P帧后,不能马上丢到buffer list里面,还需要等待后面的B帧,解码B帧后再reorder。
2、frame_num(图像的解码顺序)
参考帧和非参考帧的slice_header均有frame_num,但该语法元素只有在参考帧才有意义。
3、POC(图像播放顺序号)
POC的详细计算过程
主要用于标识图象的播放顺序,同时还用于在对帧间预测片解码时,标记参考图像的初始图像序号,表明下列情况下帧或场之间的图像序号差别:
(1)使用时间直接预测模式的运动矢量推算时;
(2)B片中使用固有模式加权预测时;
(3)解码器一致性检测时。
POC和frame_num之间存在一定的映射关系,当pic_order_cnt的值为1或者2的时候,可以通过frame_num来获得POC。
二、简单的例子
一个简单的视频序列如表1和表2所以,表1按图像顺序,表2按编码顺序。
表1 按图像顺序的视频序列
表2 按编码顺序的视频序列
说明:
1、图像顺序和编码顺序不是对应的关系,比如图像顺序为4的P帧,是图像顺序为1和2的参考帧,虽然在这两个帧之后,但是需要在他们在前进行编码。
2、frame_num按照编码的顺序从0递增,当达到最大值3后,从0重新开始递增。每个图像的frame_num为它前一个参考图像的frame_num + 1。比如:
(1)第4个图像,虽然在第1和2个图像之后,但是它前面的参考图像是第0个图像,因此,其frame_num的值为0 + 1 = 1;
(2)第1和2个图像虽然在第4个图像之后,但是,在编码顺序上,第4个图像在他们之前且是参考帧,因此他们的frame_num的值为1 + 1 = 2。
3、POC标识图像的显示顺序,因此递增的顺序和图像顺序是一致的,不过有其自己的循环,当达到最大值时,重新开始递增。POC是针对场而言的,因此每个图像都会包括顶场顺序号和底场顺序号。表1和表2中只给出了每个图像中一个场的编号。
https://www.cnblogs.com/TaigaCon/p/3551001.html
https://www.cnblogs.com/545235abc/p/4092034.html
http://www.360doc.com/content/13/0916/10/9008018_314775865.shtml
https://www.jianshu.com/p/4f988d5af787