【发布时间】:2015-05-12 16:41:12
【问题描述】:
我刚刚使用 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);
}
也考虑了每个声音的 blob,但有些声音可以持续几分钟,所以这就是为什么我将所有声音组合在一起形成一个大音频文件(比每个剪辑页面上的多个 audio 标签更好)
【问题讨论】:
标签: javascript jquery html audio