【问题标题】:Delay in playing HTML5 audio file on mobile browsers在移动浏览器上播放 HTML5 音频文件的延迟
【发布时间】:2014-12-02 05:58:06
【问题描述】:

我正在制作一个网络应用程序,我需要在单击按钮时添加一个简短的声音。

文件是 mp3 格式,大小约为 24kb,我不想使用 javascript 创建元素,所以我将它添加到 DOM 并使用 CSS 隐藏它,我还添加了 preload="auto" 所以它得到了加载了 DOM

<audio id="click" preload style="display:none;"> 
   <source src="sound/click.mp3" type="audio/mp3">
</audio>

在javascript中,我有类似的东西:

var clickSound = $('#click')[0];

然后在一个监听我拥有的按钮的偶数点击的函数中:

function(){
  clickSound.play();
}

这在我的电脑(firefox、chrome)上运行良好,但在移动设备上点击触发按钮后,它会等待大约 3 秒才能第一次播放,现在会在第一次播放后立即播放延迟播放

更新:

我注意到,即使我像这样http://example.com/sound/click.mp3 导航到手机上的 mp3 文件并点击播放,它仍然会延迟,似乎必须缓冲。

解决这个问题?

完整示例:

Here is a jsFiddle for mobile testing.

var clickSound = document.getElementById('click');
var play = document.getElementById('play');

play.addEventListener('click', function() {
      clickSound.play();
}, false);
<audio id="click" preload>
  <source src="http://scriveit.com/sound/click.mp3" type="audio/mp3">
</audio>


<input id="play" type="button" value="play sound">

【问题讨论】:

  • 这很有趣。如果您包含一个完整的示例,包括我们可以运行的 mp3,而无需找到合适的 mp3 来自己重新创建它,事情会变得更容易。
  • @misterManSam 我不允许添加外部链接
  • 谢谢,但在移动设备上也有同样的延迟,在 PC 上可以正常工作
  • 这不是为了解决问题!只是为了测试目的添加它:)小提琴重现了这个问题。对我来说,第一次播放需要等待 30 秒,之后没有延迟。刷新和首次播放会延迟约 3 秒。 Nexus 4 Chrome 浏览器。

标签: javascript jquery html android-mediaplayer media


【解决方案1】:

对较小的音频文件执行此操作的一种方法是将文件作为 blob 预加载:

<button>play</button>
<audio></audio>
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'click.mp3', true);
xhr.responseType = 'blob';
var audio = document.querySelector('audio');
xhr.onload = function () {
    audio.src = URL.createObjectURL(xhr.response);  
};
xhr.send();
document.querySelector('button').onclick = function () {
    audio.play();
};
</script>

请注意,这需要 XHR2 (http://caniuse.com/#feat=xhr2) 和 Blob URL (http://caniuse.com/#feat=bloburls),并且此处适用相同的来源策略。此外,您应该确保发送的文件带有一些强大的缓存标头,以防止客户端在每次请求时重新加载文件。

编辑:另一种方法是使用数据 URL(参见 http://jsfiddle.net/apo299od/):

<button>play</button>
<audio></audio>
<script>
var audio = document.querySelector('audio');
audio.src = 'data:audio/mp3;base64,SUQzBAAAAAA...';
document.querySelector('button').onclick = function () {
    audio.play();
};
</script>

这里的缺点是它更难维护,并且会使您的响应大小膨胀 33%。

【讨论】:

  • 你能把它添加到一个可以在移动设备上测试的工作 jsFiddle 中吗?
  • @Joel 谢谢,我现在试试看,但有什么原因会发生这种情况?其实我刚开始学JS
  • @user2666633 我想这是为了节省移动设备的带宽。不要忘记为旧版浏览器使用前缀版本的 URL。
  • @misterManSam,如果您向我提供带有 CORS 标头的 mp3 文件 :-) 以下示例的行为类似,但使用数据 URL(这将是解决问题的另一种方法):@987654324 @
  • 小提琴在移动设备上效果很好,就像 +1 你应该将它作为另一种方法添加到你的答案中:)
猜你喜欢
  • 2014-11-21
  • 2013-07-01
  • 2014-05-21
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多