Probleme Vorladen audio in Javascript
Ich versuche, eine cross-device/browser Bild-und audio-preloading-Schema für eine GameAPI ich auf Arbeit bin. Eine audio-Datei preload, und geben Sie einen Rückruf, sobald es abgeschlossen ist.
Das problem ist, audio wird nicht anfangen zu laden, auf langsame Seite geladen, sondern arbeiten in der Regel auf den zweiten Versuch, wahrscheinlich, weil es zwischengespeichert und weiß, dass es existiert.
Ich habe verengt es nach unten, um die audio.load () - Funktion. Loszuwerden es löst das problem, aber interessanterweise, mein motorola droid Bedürfnisse, die Funktion.
Welche Erfahrungen hatten Sie mit HTML5-audio-preloading?
Hier ist mein code. Ja, ich weiß, das laden von Bildern in einer separaten Funktion kann bewirken, dass eine race-condition 🙂
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();
}
Ist es schwer, das problem zu diagnostizieren, weil es zeigt keine Fehler und schlägt nur gelegentlich.
- Es ist ein Weibchen, aber ich habe es geschafft zu fälschen, indem man einfach einen laden in der audio als standard-AJAX-text-Anfragen. Ich weiß, das klingt dumm, aber sobald die Daten zwischengespeichert wird, wird es zwischengespeichert und BOOM: vorinstalliert audio. Es gibt Fragen, in denen Browser nicht laden Sie mehr als einen media-stream, ich hatte das gleiche problem mit dem video zu, stattdessen habe ich gerade geladen die thumbnails erstellt und der HTML5-player on-the-fly. Ich finde, dass faking it als AJAX-tricks, die den browser in denke, es ist nicht media.
- Interessant, werde ich mal versuchen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe es funktioniert. Die Lösung war Recht einfach eigentlich:
Grundsätzlich funktioniert es so:
Wenn es nicht offensichtlich ist, die
load
- Funktion teilt Browsern und Geräten, die es unterstützen, die Verladung zu beginnen, und dann wird der sound sofort versuchtplay
mit dervolume
praktisch bei null. Also, wenn dieload
Funktion nicht genug ist, der Tatsache, dass der sound 'braucht', gespielt zu werden, ist genug, um die trigger eine Last auf allen Geräten, die ich getestet habe.Den
load
Funktion eigentlich überflüssig jetzt, aber basierend auf der inconsistiency mit audio-Umsetzung, die es wohl nicht Schaden, es zu haben.Edit: Nach dem testen diese auf Opera, Safari, Firefox und Chrome, es sieht aus wie die Einstellung der
volume
zu 0 wird noch Vorspannung der Ressource.videoElem.mute = true
... wahrscheinlich die gleiche Eigenschaft existiert für audio-Elemente als gutcanplaythrough
feuert, wenn genügend Daten gepuffert, dass es könnte wahrscheinlich spielen non-stop zu Ende, wenn Sie begann zu spielen, die Veranstaltung. Das HTML-Audio-element ist speziell für streaming, also die Datei nicht völlig fertig heruntergeladen durch die Zeit, die dieses Ereignis feuert.Kontrast zu Bildern, die nur Feuer Ihre event, sobald Sie vollständig heruntergeladen wurde.
Wenn Sie navigieren Weg von der Seite und die audio wurde nicht vollständig beendet herunterladen, der browser wahrscheinlich kein cache ist es auf alle. Jedoch, wenn es fertig ist, komplett herunterladen, ist es wahrscheinlich, zwischengespeichert, und das erklärt das Verhalten, das Sie gesehen haben.
Ich würde empfehlen, die HTML5 AppCache um sicherzustellen, dass die Bilder und audio sind sicher zwischengespeichert.
Den AppCache, wie oben vorgeschlagen, könnte Ihre einzige Lösung, um die audio-Cache einer browser-Sitzung zu einem anderen (das ist nicht das, was du wolltest, richtig?). aber Bedenken Sie die begrenzte Menge an Raum, einige Browser bieten. Safari zum Beispiel erlaubt es dem Benutzer diesen Wert zu ändern in den Einstellungen, aber der Standardwert ist 5 MB - kaum genug, um zu sparen eine Menge songs, vor allem, wenn andere Webseiten besucht werden, die Ihre Nutzer verwenden AppCache als gut. Auch IE <10 nicht unterstützen AppCache.
Alright, so dass ich lief in das gleiche problem vor kurzem, und mein trick war, um eine einfache ajax-request zum laden der Datei durchaus einmal (welches Ende in den cache), und dann durch laden der sound wieder direkt aus dem cache, und verwenden Sie die Veranstaltung verbindlich
canplaythrough
.Mit Buzz.js als mein HTML5-audio-Bibliothek, mein code ist im Grunde so etwas: