懒人李冰

记录我的生活、学习

HEVC SPEC 学习之 Frame Rate

Frame Rate是显示器上显示图像的频率,单位是 Hz,它作为视频文件的一个重要参数,本文记录HEVC码流中它的计算方法。

HEVC 中关于Frame Rate的计算可以包含五中:从SPS中获取、从VPS中获取、从视频文件的Container层获取、根据PTS获取、选择默认值。

SPS Frame Rate

  • vui_parameters_present_flag 值为 1 表示该码流中vui_parameters()语法结构存在。否则,该码流中不存在 VUI 结构。
  • vui_timing_info_present_flag 值为 1 表示该码流中vui_num_units_in_tickvui_time_scalevui_poc_proportional_to_timing_flagvui_hrd_parameters_present_flag存在,否则这些语法元素不存在。
if(vui_timing_info_present_flag){  
vui_num_units_in_tick u(u32)
vui_time_scale u(32)
vui_poc_proportional_to_timing_flag u(1)
 
}  
  • vui_num_units_in_tick 是运行在time_scale Hz的频率(相应地时钟跳变计数器加一,称作一个时钟跳变)下的时钟的时间单元的数量。vui_num_units_in_tick应该大于 0。 一个时钟跳变(单位是秒),它等于vui_num_units_in_tick除以vui_time_scale的四分之一。例如,视频信号的采样率是 25Hz,vui_time_scale值为 27000000,vui_num_units_in_tick值为1080000,因此一个时钟跳变值为 0.04 秒。

当 SPS 参考的 VPS 中有vps_num_units_in_tick存在时,vui_num_units_in_tick如果存在,就应该等于vps_num_units_in_tick,vui_num_units_in_tick如果不存在,被推断为vps_num_units_in_tick

  • vui_time_scale 是一秒内时间单元的数量。例如,一个以 27MHz 的时钟测量时间的时间坐标系的time_scale为 27000000。vui_time_scale的值应该大于 0。

当 SPS 参考的 VPS 中有vps_time_scale存在时,vui_time_scale如果存在,就应该等于vps_time_scale,vui_time_scale如果不存在,被推断为vps_num_units_in_tick

通过 SPS 计算的 FPS 的值为fps = sps->vui->time_scale/sps->vui_num_units_in_tick

VPS Frame Rate

if(vps_timing_info_present_flag){  
vps_num_units_in_tick u(32)
vps_time_scale u(32)
vps_poc_proporitonal_to_timing_flag u(1)
 
}  
  • vps_num_units_in_tick 是运行在vps_time_scale Hz的频率(相应地时钟跳变计数器加一,称作一个时钟跳变)下的时钟的时间单元的数量。vps_num_units_in_tick应该大于 0。 一个时钟跳变(单位是秒),它等于vps_num_units_in_tick除以vps_time_scale的四分之一。例如,视频信号的采样率是 25Hz,vps_time_scale值为 27000000,vps_num_units_in_tick值为1080000,因此一个时钟跳变值为 0.04 秒。

  • vps_time_scale 是一秒内时间单元的数量。例如,一个以 27MHz 的时钟测量时间的时间坐标系的vps_time_scale为 27000000。vps_time_scale的值应该大于 0。

通过 VPS 计算的 FPS 的值为fps = vps->time_scale / vps->num_units_in_tick

Container Frame Rate

这种方法得到的Frame Rate,其实并不是通过解码器得到的,而是通过从 DMX 端通过分析Container得到的,此处不做分析。

PTS Frame Rate

如果上面都没有Frame Rate的信息,就可以通过PTS来计算出Frame Rate。方法就是通过计算 PTS 的间隔,然后得出Frame Rate的值。

注意,对于HEVC中,如果是Interlace码流,Frame Rate需要减半。