HTML5 audio/video 标签如何确定持续时间

How does the HTML5 audio/video tag determine duration

HTML5 <audio><video> 标签支持 duration 属性。我很好奇,在不下载整个 audio/video 源文件的情况下,浏览器如何能够确定媒体的持续时间?

我问是因为我想在我正在编写的后端服务中实现相同的功能:

  1. 接受一个 url 一个 mp3
  2. 确定文件的长度(以秒为单位),无需下载整个文件

大多数视频容器都包含视觉和音频元素,还有一个元数据块,用于描述诸如持续时间、色彩空间、使用的编解码器和每个帧的偏移量(在搜索时很有用)。在为网络编码为 MP4 的典型视频中,此块(又名 MOOV 原子)默认为文件末尾(因为帧位置直到末尾才知道),除非已执行第二遍将其移动到前面eg:

ffmpeg -i source.mp4 -c:a copy -c:v copy -movflags faststart destination.mp4

(原样复制音频和视频,只是将元数据移动到开头以加快访问速度)

您可能遇到过一些网络视频,您几乎可以立即使用 MP4 进行搜索,而另一些网络视频则需要等到文件完全加载后才能准确搜索...这是因为浏览器必须 'guesses' 直到它收到该元数据

对于 mp3 文件,您可以使用类似 this - to request the server gives you just the ID3 Tag and eTag 的数据(最后 127 和 227 字节),而无需下载整个文件