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
需要减半。