持续时间是某件事持续的时间长度。在媒体文件中,持续时间指总播放时长。视频持续时间表示一个视频从开始到结束播放的时间长度,音频持续时间对一首歌或一段录音也是同样的含义。
你通常会在媒体播放器中把这个数值看到为总时长。在元数据中,相同的信息会出现在名为 Duration 的字段里。
哪些文件携带它
持续时间属于那种会随时间播放的文件,也就是音频和视频文件。静态照片和文本文档通常没有持续时间字段。
动画图片是一个特殊情况。GIF 文件会为每一帧保存一个延迟时间,而不是总时长。ExifTool 仍然会为动画的一次播放报告一个 Duration。
数值的来源
有些格式会直接保存长度。其他格式会保存一些数值,软件通过这些数值来计算长度。
- MP4 和 MOV:影片头部会保存时间刻度和持续时间。时间刻度是每秒包含的时间单位数量,而持续时间就是这些单位的计数。
- MKV 和 WebM:分段信息中可以包含一个可选的
Duration元素,以“tick”计数。默认情况下,一个 tick 等于一毫秒。 - MP3:ID3 标签中可以有一个
TLEN帧,长度以毫秒计。ExifTool 会根据其他数值(例如文件大小和比特率)来计算长度。 - FLAC:文件会保存样本总数和采样率。软件会根据这两个数值计算长度,总数为
0时表示长度未知。 - WAV:ExifTool 会根据平均每秒字节数和文件大小来计算长度。
数值的呈现方式
同样的长度可以以不同形式出现,这取决于读取文件的程序:
00:05:15:小时、分钟和秒。这个文件的播放时长为 5 分 15 秒。15.23 s:秒数,并显示单位。200.541000:一个没有单位的数字。FFmpeg 项目的 ffprobe 程序会用这种方式输出持续时间,小数点后有 6 位。这一数字表示 200.541 秒,大约是 3 分 21 秒。N/A:在默认输出格式中,ffprobe 在持续时间缺失时会输出这个值。JSON 和 XML 输出格式则会直接省略持续时间字段。
没有单位的数字不一定是以秒为单位。TLEN 帧以毫秒计数,而 ffprobe 中的 duration_ts 值以流的时间基单位计数。请检查这个数字来自哪个字段。
为什么程序会显示不同的时长
不同程序对同一个文件可能显示不同的持续时间,而且两边都不一定是错的。原因有 4 个:
- 四舍五入:只显示整秒的播放器会把
200.541四舍五入。 - 独立轨道:画面和声音有各自独立的轨道,每条轨道都有自己的持续时间。在 MOV 文件中,影片持续时间对应的是最长的那条轨道。
- 起始时间:每条流都可以有自己的起始时间。FFmpeg 可以从最早的开始时间测量到最晚的结束时间,因此晚开始的一条流会让总时长变长。
- 估算:一个文件可以只有比特率而没有持续时间。这种情况下,FFmpeg 会根据比特率和文件大小估算持续时间,并警告结果可能不精确。
它的重要性
持续时间可以让你在不播放文件的情况下检查文件。如果你期待的是一个 5 分 15 秒的片段,却看到 15.23 s,这个文件可能不是你想要的那个。
持续时间也和其他数值相关。FFmpeg 可以根据文件大小和持续时间计算整体比特率。