J'essaie de créer un schéma de préchargement d'image et d'audio pour un GameAPI sur lequel je travaille. Un fichier audio sera préchargé, et émettra un callback une fois qu'il sera terminé.
Le problème est que l'audio ne commence pas à se charger lors du chargement de pages lentes, mais fonctionne généralement au deuxième essai, probablement parce qu'il a été mis en cache et qu'il sait qu'il existe.
J'ai réduit le problème à la fonction audio.load(). La supprimer résout le problème, mais il est intéressant de noter que mon motorola droid a besoin de cette fonction.
Quelles sont les expériences que vous avez eues avec le préchargement audio HTML5 ?
Voici mon code. Oui, je sais que le fait de charger les images dans une fonction séparée pourrait causer une condition de course :)
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();
}
Il est difficile de diagnostiquer le problème car il n'affiche aucune erreur et ne tombe en panne qu'occasionnellement.