流式传输 MP3 而不是使用 HTML5 音频标签下载它

Posted

技术标签:

【中文标题】流式传输 MP3 而不是使用 HTML5 音频标签下载它【英文标题】:Streaming MP3 instead of downloading it with HTML5 audio tag 【发布时间】:2014-06-14 15:44:15 【问题描述】:

document.ready 函数中,我有这个:

audioElement = document.createElement('audio');

audioElement.setAttribute('src', 'http://www.mfiles.co.uk/mp3-downloads/Toccata-and-Fugue-Dm.mp3');

$('#ToggleStart').click(function () 
    audioElement.play();
);

$('#ToggleStop').click(function () 
    audioElement.pause();
);

问题是在页面加载时会下载 MP3,这会导致加载时间过长,因为 MP3 超过 2MB。我想要的是要流式传输的 MP3。这可能吗?如果可以,我需要改变什么?

jsFiddle here

【问题讨论】:

【参考方案1】:

您已经非常接近正确了。我查看了您的 JSFiddle 并注意到音频已经流式传输(我可以在文件完成下载之前播放文件)。您可以通过检查浏览器中的网络流量轻松看到这一点:

Chrome 显示“部分内容”,但同时正在播放 mp3。您的具体问题似乎是它正在下载和播放太早。因此,如果我们看一下spec,我们可以看到一些选项。

preload = "none" or "metadata" or "auto" or "" (empty string) or empty
Represents a hint to the UA about whether optimistic downloading of the audio stream itself or its metadata is considered worthwhile.
- "none": Hints to the UA that the user is not expected to need the audio stream, or that minimizing unnecessary traffic is desirable.
- "metadata": Hints to the UA that the user is not expected to need the audio stream, but that fetching its metadata (duration and so on) is desirable.
- "auto": Hints to the UA that optimistically downloading the entire audio stream is considered desirable.

由于您没有显示有关音频文件的任何信息,我们可以忽略metdata 选项,这意味着您要设置preload="none" 属性。因此,如果您稍微更改您的 JSFiddle 以动态设置:

audioElement.setAttribute('preload', "none");
audioElement.setAttribute('src', 'http://www.mfiles.co.uk/mp3-downloads/Toccata-and-Fugue-Dm.mp3');

这是显示结果的JSFiddle,如果您在 Chrome 中打开网络选项卡,您会看到在开始播放 mp3 之前下载不会开始。

【讨论】:

以上是关于流式传输 MP3 而不是使用 HTML5 音频标签下载它的主要内容,如果未能解决你的问题,请参考以下文章

查找带有 HTML5 <audio> 标签的流式 MP3 文件

使用 MPEG DASH 流式传输纯音频 (.mp3) 文件

将音频从 Node.js 服务器流式传输到 HTML5 <audio> 标签

从网络服务器流式传输音频

仅使用视频标签实时流式传输到 HTML5(没有 webrtc)

AvPlayer 正在下载 mp3 而不是流式传输