ffmpeg 中的视频时标、时基或时间戳是啥?
Posted
技术标签:
【中文标题】ffmpeg 中的视频时标、时基或时间戳是啥?【英文标题】:What is video timescale, timebase, or timestamp in ffmpeg?ffmpeg 中的视频时标、时基或时间戳是什么? 【发布时间】:2017-09-06 02:37:52 【问题描述】:网上似乎没有关于这些是什么的任何解释。人们经常谈论它们。我只想知道它们是什么以及为什么它们很重要。使用 -video_track_timescale,我将如何确定它的数字?是随机的吗?应该是0吗?
【问题讨论】:
【参考方案1】:现代容器使用时间戳而不是帧速率来管理视频(和音频)帧呈现的时间分量。因此,它们不是以 25 fps 的速度录制视频,从而暗示每帧应相隔 0.04 秒绘制,而是为每帧存储一个时间戳,例如
Frame pts_time
0 0.00
1 0.04
2 0.08
3 0.12
...
为了精确解析这些时间值,使用了时基,即表示时钟一个滴答的时间单位。因此,1/75
的时基代表 1/75 秒。 P怨恨 TimeStamps 然后根据这个时基来命名。时标只是时基的倒数。 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
...
这种调节时间的方法允许可变帧率视频。
【讨论】:
时基可以是至少尊重 FPS 的任何数字,即对于 25 fps,它应该至少是 1/25。如果是 1/15,则取决于多路复用器,ffmpeg 将丢帧或将输出帧速率更改为 15。帧速率可以是小数,因此是有理数。时基是合理的,因为它们代表几分之一秒。 通常使用 90,000 作为通用计算基数的原因是它是一个可被 24、25 和 30 整除的数字(在每种情况下,结果都是整数 -没有余数、小数或分数),因此该数学同样适用于处理每秒 24 帧、25 fps 和 30 fps。 @Ed999 是正确的,90000 是 24、25 和 30 的整数倍,但这不是原因。为此目的,600 就足够了,Quicktime 编写者通常使用该值作为时间尺度。 "为方便起见,PCR、PTS 或 DTS 出现的方程导致时间值精确到 (300 × 2^33/system_clock_frequency) 秒的某个整数倍. 这是由于 PCR 时序信息编码为系统时钟频率的 1/300 的 33 位加上其余部分的 9 位,而对于 PTS 和 DTS,编码为系统时钟频率的 33 位除以 300。 i>" 27 Mhz / 300 = 90000 Hz。以上是关于ffmpeg 中的视频时标、时基或时间戳是啥?的主要内容,如果未能解决你的问题,请参考以下文章