2017-04-10 48 views

回答

13

现代容器使用时间戳而不是帧率来控制视频(和音频)帧的时间分量。因此,不是将视频记录为25fps,并且因此意味着每个帧应该相隔0.04秒,它们为每个帧存储时间戳,例如,

Frame  pts_time 
    0   0.00 
    1   0.04 
    2   0.08 
    3   0.12 
    ... 

对于这些时间值的精确分辨率的缘故,一个时基被用于即时间,该时间代表一个时钟的一个刻度的单元,因为它是。所以,1/75的时基代表1/75秒。 P表示T ime S然后根据这个时基对tamps进行计数。时间尺度只是时基的倒数。 FFmpeg将时间刻度显示为流读数中的tbn值。

Timebase = 1/75; Timescale = 75 
Frame  pts   pts_time 
    0   0   0 x 1/75 = 0.00 
    1   3   3 x 1/75 = 0.04 
    2   6   6 x 1/75 = 0.08 
    3   9   9 x 1/75 = 0.12 
    ... 

这种调节时间的方法允许可变帧频视频。

+0

非常感谢你,你的解释帮了我很多!但在第二部分中,您为PTS和时基1/75选择了数字0,3,6和9。 1)我可以选择任何我想要的PTS方法吗?如总和1000或总和1? 2)您是否选择了1/75,因为它补充了25/1 FPS?或者我也可以选择任何号码?像1000或1/90000,还是应该是与FPS有关的东西?为什么一个分子/分母而不是一个简单的数字? 我应该关心拿起这些数字的原因是什么? –

+0

时基可以是至少考虑FPS的任何数字,即对于25 fps,它应该至少为1/25。如果它是1/15,则取决于复用器,ffmpeg将丢弃帧或将输出帧率改为15.帧率可以是小数,因此是有理数。时间基因是合理的,因为它们代表了一秒的几分之一。 – Mulvya

+2

通常使用90,000作为通用计算基础的原因是它是一个可以被24,25和30除尽的数字(在每种情况下结果都是一个整数 - 没有余数,小数或分数),因此数学同样适用于处理每秒24帧,每秒25帧和每秒30帧。 – Ed999