我刚刚使用 socket.io 构建了一个实时应用程序,其中“主”用户可以在接收设备(桌面浏览器、移动浏览器)上触发声音。该主用户会看到声音文件列表,并且可以在声音文件上单击“播放”。
音频播放在浏览器上是即时的。然而,在移动设备上,会出现 0.5-2 秒的延迟(我的 Nexus 4 和 iPhone 5 约为 1 秒,iPhone 3GS 为 1-2 秒)。
我尝试了多种方法来优化音频播放,使其在手机上播放速度更快。现在(我想说的是,在其优化的最佳“阶段”),我将所有 mp3 合并到一个音频文件中(它创建 .mp3、.ogg 和 .mp4 文件)。我需要有关如何进一步解决/改进此问题的想法。瓶颈似乎确实存在于 hmtl 5 音频方法中,例如.play()
.
在我这样使用的接收器上:
<audio id="audioFile" preload="auto">
<source src="/output.m4a" type="audio/mp4"/>
<source src="/output.mp3" type="audio/mpeg"/>
<source src="/output.ogg" type="audio/ogg"/>
<p>Your browser does not support HTML5 audio.</p>
</audio>
在我的JS中:
var audioFile = document.getElementById('audioFile');
// Little hack for mobile, as only a user generated click will enable us to play the sounds
$('#prepareAudioBtn').on('click', function () {
$(this).hide();
audioFile.play();
audioFile.pause();
audioFile.currentTime = 0;
});
// Master user triggered a sound sprite to play
socket.on('playAudio', function (audioClip) {
if (audioFile.paused)
audioFile.play();
audioFile.currentTime = audioClip.startTime;
// checks every 750ms to pause the clip if the endTime has been reached.
// There is a second of "silence" between each sound sprite so the pause is sure to happen at a correct time.
timeListener(audioClip.endTime);
});
function timeListener(clipEndTime) {
this.clear = function () {
clearInterval(interval);
interval = null;
};
if (interval !== null) {
this.clear();
}
interval = setInterval(function () {
if (audioFile.currentTime >= clipEndTime) {
audioFile.pause();
this.clear();
}
}, 750);
}
也考虑了每个声音的斑点,但有些声音可以持续几分钟,所以这就是为什么我将所有声音组合在一起形成 1 个大音频文件(比几个声音文件更好)audio
每个剪辑页面上的标签)
我没有暂停/播放,而是在不应该播放时将音量设置为 0,在应该播放时将音量设置回 1。这Audio
方法currentTime
and volume
即使在 iPhone 3GS 上也不会减慢音频播放速度。
我还向音频元素添加了“循环”属性,因此它永远不必.play()
再次编辑。
将所有 mp3 声音组合在一起是富有成效的,因为该解决方案因此可以发挥作用。
编辑:audioElement.muted = true 或audioElement.muted = false 更有意义。
Edit2:无法在 iOS 上代表用户控制音量,因此我必须暂停()和播放()音频元素,而不是仅仅将其静音和取消静音。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)