我正在为一个 GameAPI 设计跨设备/浏览器的图像和音频预加载方案。音频文件将被预加载,并在完成后发出回调。
问题是,在页面加载缓慢时,音频不会开始加载,但通常在第二次尝试时就能正常工作,可能是因为它已经缓存并知道其存在。
我把问题缩小到了 audio.load() 函数。去掉它可以解决问题,但有趣的是,我的 Motorola Droid 需要该函数。
你在 HTML5 音频预加载方面有哪些经验?
这是我的代码。是的,我知道在单独的函数中加载图片可能会导致竞争条件 :)
问题是,在页面加载缓慢时,音频不会开始加载,但通常在第二次尝试时就能正常工作,可能是因为它已经缓存并知道其存在。
我把问题缩小到了 audio.load() 函数。去掉它可以解决问题,但有趣的是,我的 Motorola Droid 需要该函数。
你在 HTML5 音频预加载方面有哪些经验?
这是我的代码。是的,我知道在单独的函数中加载图片可能会导致竞争条件 :)
var resourcesLoading = 0;
function loadImage(imgSrc) {
//alert("Starting to load an image");
resourcesLoading++;
var image = new Image();
image.src = imgSrc;
image.onload = function() {
//CODE GOES HERE
//alert("A image has been loaded");
resourcesLoading--;
onResourceLoad();
}
}
function loadSound(soundSrc) {
//alert("Starting to load a sound");
resourcesLoading++;
var loaded = false;
//var soundFile = document.createElement("audio");
var soundFile = document.createElement("audio");
console.log(soundFile);
soundFile.autoplay = false;
soundFile.preload = false;
var src = document.createElement("source");
src.src = soundSrc + ".mp3";
soundFile.appendChild(src);
function onLoad() {
loaded = true;
soundFile.removeEventListener("canplaythrough", onLoad, true);
soundFile.removeEventListener("error", onError, true);
//CODE GOES HERE
//alert("A sound has been loaded");
resourcesLoading--;
onResourceLoad();
}
//Attempt to reload the resource 5 times
var retrys = 4;
function onError(e) {
retrys--;
if(retrys > 0) {
soundFile.load();
} else {
loaded = true;
soundFile.removeEventListener("canplaythrough", onLoad, true);
soundFile.removeEventListener("error", onError, true);
alert("A sound has failed to loaded");
resourcesLoading--;
onResourceLoad();
}
}
soundFile.addEventListener("canplaythrough", onLoad, true);
soundFile.addEventListener("error", onError, true);
}
function onResourceLoad() {
if(resourcesLoading == 0)
onLoaded();
}
由于没有错误提示,只是偶尔失败,因此很难诊断该问题。