javascript 在移动的浏览器上播放HTML5音频文件的延迟

lymgl2op  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(222)

我正在制作一个网络应用程序,我需要在点击按钮时添加一个简短的声音。
文件是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();
}

这在我的电脑(火狐,Chrome)上运行良好,但在手机上点击触发按钮后,它会等待大约3秒钟才能首次播放,并且 * 现在将在第一次延迟播放后立即播放 *。

    • 更新日期:**

我注意到即使我像这样导航到手机上的MP3文件并点击播放,它仍然会延迟,似乎它必须缓冲。
在这个问题上

完整示例:

Here is a jsFiddle for mobile testing.
一个三个三个一个

tmb3ates

tmb3ates1#

对于较小的音频文件,一种方法是将文件预加载为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%。

zbq4xfa0

zbq4xfa02#

更新音频标签中的属性:

    • 错误:**
<audio id="click" preload>
  <source src="http://scriveit.com/sound/click.mp3" type="audio/mp3">
</audio>
    • 正确:**
<audio id="click" preload="metadata">
  <source src="http://scriveit.com/sound/click.mp3" type="audio/mp3">
</audio>
    • 示例:**
<audio preload="auto|metadata|none">

参考:https://www.w3schools.com/tags/att_audio_preload.asp

    • 警告:**

参考:https://developer.mozilla.org/en-US/docs/Web/Guide/Audio_and_video_delivery/Cross-browser_audio_basics

    • 解决方案:**
const audio = new Audio('http://scriveit.com/sound/click.mp3');
audio.load();

参考:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/load

相关问题