SPS重要参数
- pic_width_in_minus1 - > 图像宽度包含的宏块个数-1
第一行中mbs部分指的是宏块的数量,pic_width_in_minus1即图像宽度包含的宏块个数-1,当计算真实的图像宽度时,需要用pic_width_in_minus1加一,然后整体乘宏块的宽度。
- pic_heigh_in_minus1 -> 图像高度包含的宏块个数-1
pic_heigh_in_minus1也是一样的原理。
所以在拿到SPS的这两个属性时,就可以知道图像的宽高各是多少。
- frame_mbs_only_flag -> 帧编码还是场编码
帧编码是逐行扫描,产生一幅图片,场编码是进行隔行扫描,产生两幅图片。
- frame_cropping_flag -> 帧的图片是否需要进行裁剪
如果这个参数为1,也就是进行了裁剪,那么计算分辨率时就需要关注后边四个参数,也就是上下左右四周减去多少。
如果是帧编码,由于就只有一幅图片,所以就直接剪去offset就可以,但是遇见场编码时,由于含有两幅图片,所以宽虽然不变,但是高是两倍(两幅图片都是隔行扫描的)
帧相关
- 帧数 log2_max_frame_num_minus4
在一个GOP中最大帧数,log2代表2的N次方,所以帧数就是2的max_frame_num_minus4次方。
还可以根据这个值计算出被解码的帧的序号是多少。
- 参考帧帧数 max_num_ref_frames
决定着解码时参考帧的队列设置为多大,例如将max_num_ref_frames设置为3,则参考帧的队列就会被设置为3。
- 显示帧序号 pic_ordef_cnt_type
将编码后的数据进行解码后,在一个GOP中帧显示的顺序也是有一个计算公式的,根据这个值来进行计算,这个值指的不是显示的具体是哪一帧,而是orderorder count类型,有0、1、2三种类型。
具体是哪一号显示的,是根据type值进行计算的 ,对于不同的type有不同的计算公式。
帧率的计算
framerate = (float)(sps->vui.vui_time_scale) / (float)(sps->vui.vui_num_units_in_tick) / 2;