我的页面上有一个音频元素,设置如下:
<audio id="audio" controls preload="metadata">
<source src="/audio/episode.mp3" type="audio/mpeg">
<source src="/audio/episode.ogg" type="audio/ogg">
[Not supported message]
</audio>
我很高兴preload
被设置为“元数据”,因为能够看到文件的长度是很方便的,并且能够跳过前面而不必先点击播放按钮是很好的。
但后来我注意到在Firefox和IE中,这个“元数据”的加载量在20KB到50KB之间。 Chrome更糟糕,加载超过1MB。对于时间戳来说,似乎浪费了很多带宽。
我知道preload
被浏览器视为more what you'd call 'guidelines' than actual rules。我也发现了这个more in-depth article about the issue。
有没有减少这些请求大小的方法?
我试过/考虑过的
我尝试在文本编辑器中快速剪切文件中的大部分元数据作为测试。这使得Firefox和IE中的请求变得更大,但让我乐观地认为有一些方法可以积极地影响它。
我还考虑在页面上包含长度并使用javascript进行设置,但这些设置似乎是只读的。
最后,我一直在想,作为最后的手段,我可以生成一个完全相同长度的空音频文件,将其压缩到尽可能小的文件,然后当用户与之交互时,将其交换出来对于真正的*。在这一点上,我意识到我应该得到一些帮助......
*编辑:我最终尝试了这个!它对我的网站不起作用,但至少它很有趣。我把它作为答案包含在下面。
这个解决方案很糟糕,但它确实具有可测量的效果。通过最初使用静音doppelganger加载页面,然后在音频开始播放时将其切换为真实文件,我设法在初始页面加载时节省了很多。
以下是我用10分钟20秒长mp3的平均结果。之前和之后:
IE:16KB - Firefox:43KB - Chrome:1.4MB
IE:15KB - Firefox:08KB - Chrome:34KB
在Chrome上节省的是1.36MB,more data than the full text of Crime and Punishment。这是代码:
HTML
<audio id="audio" controls preload="metadata">
<source src="/silence.mp3" type="audio/mpeg">
</audio>
使用Javascript
var audio = document.getElementById("audio");
var time, volume, muted;
audio.addEventListener("playing", loadAudio, false);
function loadAudio(e) {
time = audio.currentTime;
volume = audio.volume;
muted = audio.muted;
audio.innerHTML = "<source src=\"/episode.mp3\" type=\"audio/mpeg\">";
audio.setAttribute("preload", "auto");
audio.load();
audio.addEventListener("canplaythrough", playAudio, false);
e.target.removeEventListener(e.type, arguments.callee);
}
function playAudio(e) {
audio.currentTime = time;
audio.volume = volume;
audio.muted = muted;
audio.play();
e.target.removeEventListener(e.type, arguments.callee);
}
这只是作为测试而写的;它可以改进很多。
这种方法有足够的缺点,我认为我不会使用它。这些包括:
也就是说,希望这种方法适用于那里的人!至少玩它很有趣。