在ffmpeg中,视频时间刻度、时间基准或时间戳是什么?

84
目前网上似乎没有关于这些内容的任何解释。人们经常谈论它们,我只想知道它们是什么以及为什么它们很重要。使用-video_track_timescale,我该如何确定其数字?它是随机的吗?应该为0吗?
1个回答

166

现代容器使用时间戳来控制视频(和音频)帧的呈现时间,而不是帧速率。因此,他们不再像以前一样将视频记录为25 fps,这意味着每个帧应该相距0.04秒,而是为每个帧存储一个时间戳,例如:

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

为了精确解析这些时间值,使用了时间基准,即表示时钟一刻的时间单位。因此,时间基准 1/75 表示 1/75 秒。演示时间戳以此时间基准为单位计算。时间刻度就是时间基准的倒数。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
   ...

这种时间调节方法可以支持可变帧率视频。


27
使用90,000作为计算的常见基数是因为它可以被24、25和30整除(在每种情况下,结果都是整数-没有余数、小数或分数),因此这种数学方法同样适用于处理每秒24帧、25帧和30帧的视频。 - Ed999
9
@Ed999正确指出,90000是24、25和30的整数倍,但这不是原因。600就足够实现这个目的了,而Quicktime写作人员通常使用这个值作为时间刻度。 - Gyan
5
为了方便标记,出现PCR、PTS或DTS的等式会导致时间值精确到(300 × 2^33/system_clock_frequency)秒的整数倍。这是由于将PCR时间信息编码为33位表示系统时钟频率的1/300和9位余数,以及将PTS和DTS编码为33位表示系统时钟频率除以300而导致的。 - Gyan
8
27 MHz / 300 = 90000 Hz。 - Gyan
2
刚刚看到这个,想在数学角度上添加一个相关问题的链接和在15分钟内回答的答案:https://dev59.com/sqbja4cB1Zd3GeqPhYFj?rq=1 - Harry
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接