【发布时间】:2018-12-24 18:04:18
【问题描述】:
HTML5 <audio> 和 <video> 标记支持 duration 属性。我很好奇,在不下载整个音频/视频源文件的情况下,浏览器如何能够确定媒体的持续时间?
我问是因为我想在我正在编写的后端服务中实现相同的功能:
- 接受 mp3 的网址
- 确定文件的长度(以秒为单位),无需下载整个文件
【问题讨论】:
标签: html audio html5-video html5-audio
HTML5 <audio> 和 <video> 标记支持 duration 属性。我很好奇,在不下载整个音频/视频源文件的情况下,浏览器如何能够确定媒体的持续时间?
我问是因为我想在我正在编写的后端服务中实现相同的功能:
【问题讨论】:
标签: html audio html5-video html5-audio
大多数视频容器都包含视觉和音频元素,还包含一个元数据块,用于描述持续时间、色彩空间、使用的编解码器和每帧的偏移量(在搜索时很有用)。在为网络编码为 MP4 的典型视频中,此块(又名 MOOV 原子)默认位于文件的末尾(因为直到最后才知道帧位置),除非已执行第二次传递以将其移动到前面如:
ffmpeg -i source.mp4 -c:a copy -c:v copy -movflags faststart destination.mp4
(复制音频和视频不变,只是将元数据移动到开头以实现更快的访问)
您可能已经体验过一些网络视频,您几乎可以使用 MP4 立即搜索,而有些视频在文件完全加载之前无法准确搜索...这是因为浏览器必须做出“猜测”,直到它接收元数据
对于 mp3 文件,您可以使用 this 之类的东西 - 请求服务器只为您提供 ID3 标记和 eTag 数据(最后 127 和 227 字节),而无需下载整个文件
【讨论】:
<audio> 标签似乎能够做到这一点,除非它真的如此快速地预缓存文件以至于我没有注意到......
<audio> 标签加载到一个隐藏元素中,只是为了提取持续时间,这样我就可以将它作为请求发送到后端……