【问题标题】:How does the HTML5 audio/video tag determine durationHTML5 音频/视频标签如何确定持续时间
【发布时间】:2018-12-24 18:04:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: html audio html5-video html5-audio


    【解决方案1】:

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

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

    (复制音频和视频不变,只是将元数据移动到开头以实现更快的访问)

    您可能已经体验过一些网络视频,您几乎可以使用 MP4 立即搜索,而有些视频在文件完全加载之前无法准确搜索...这是因为浏览器必须做出“猜测”,直到它接收元数据

    对于 mp3 文件,您可以使用 this 之类的东西 - 请求服务器只为您提供 ID3 标记和 eTag 数据(最后 127 和 227 字节),而无需下载整个文件

    【讨论】:

    • 我可以看到它适用于磁盘上的一个文件,但是在某个网络服务器上的某个文件呢? <audio> 标签似乎能够做到这一点,除非它真的如此快速地预缓存文件以至于我没有注意到......
    • 如果托管文件的服务器支持字节范围请求,您可以请求您想要的特定块。因为 mp3 标签位置是已知的,所以浏览器可能已经这样做了(先获取元数据,然后继续)
    • 谢谢。我现在想知道我是否应该让我的前端将<audio> 标签加载到一个隐藏元素中,只是为了提取持续时间,这样我就可以将它作为请求发送到后端……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多