Я пытаюсь создать кросс-устройство / браузер и схему предварительной загрузки звука для GameAPI, над которым я работаю. Звуковой файл будет предварительно загружен и выдаст обратный вызов после его завершения.
Проблема в том, что аудио не начинает загружаться при медленной загрузке страницы, но обычно будет работать со второй попытки, возможно потому, что оно кэшировало его и знает, что оно существует.
Я сузил его до функции audio.load (). Избавление от этого решает проблему, но, что интересно, моей дроиде-мотороле нужна эта функция.
Какие у вас были опыты с предварительной загрузкой аудио в 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();
}
Трудно диагностировать проблему, поскольку она не показывает ошибок и дает сбой только изредка.