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_tick、vui_time_scale、vui_poc_proportional_to_timing_flag和vui_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需要减半。