时间基是流内部计数使用的时间单位。媒体文件不会直接用秒来存储时间戳,而是用自身时钟的“滴答”来计数,时间基说明每一“滴答”持续多长时间。它以秒的分数形式表示。
哪些文件包含它以及该数值从何而来
你会在媒体文件中的各个独立流上看到时间基,包括 MP4、MOV、MKV、WebM、AVI 和 MPEG 传输流中的画面、声音和任意字幕流,以及独立音频文件中的音频流。每个流都有自己的时间基,因此同一个文件中的音频和视频通常使用不同的计数单位。
该值由编码器或生成文件的程序决定。某些封装格式要求使用特定的时间基,并将其固定不变;在格式未做强制规定时,写入程序会选择一个适合内容的时间基,文件也可能直接沿用该程序的默认设置。
该数值的格式
时间基始终是一个分数,其分母表示每秒包含多少个滴答:
1/1000- 每个滴答为一毫秒,Matroska 和 WebM 文件中常用的选择1/90000- 在 MPEG 传输流中长期使用的设置1/48000- 音频流通常按采样来计数,因此时间基会与采样率一致1/12800- 在 MP4 文件的视频流中常见的取值
要将时间戳换算为秒,将时间戳乘以该分数即可。在时间基为 1/12800 的流中,展示时间戳为 12800 就恰好对应 1 秒;在时间基为 1/1000 的流中,时间戳为 3500 则对应 3.5 秒。这也是报告中的原始时间戳看起来像巨大数字的原因,它们是滴答计数,而不是秒。一些较老的应用还可能在这一行旁边单独打印一行“Codec Time Base”。
它的重要性
媒体文件中的所有事件都发生在整数个滴答上,因此时间基决定了该流能表达的最精细时间粒度。如果某帧或某个采样落在两个滴答之间,就必须对其时间戳进行取整,取整误差会不断累积。
在帧率不是整数的视频中,这会成为一个实际问题。在 30000 帧 / 1001 秒的广播帧率下,每帧略高于 33 毫秒,但并不是整数毫秒,因此以毫秒为单位的时间基无法让任何一帧精确对齐。每秒滴答数更多的时间基(分母更大)可以精确落在每一个帧边界上,这也是为什么编码器更偏好 1/12800 或 1/90000 这样的取值,而不是简单的毫秒。
其后果会表现为时间错误,而不是单帧画面中能直接看到的问题:声音与画面逐渐不同步、帧间间隔不均匀、剪切或跳转略有偏移。将时间基不同的流拼接在一起时,所有时间戳都必须重新缩放,这种转换是典型的同步错误来源。该字段本身不会影响图像或声音质量,也不包含任何个人信息。