5

Wir haben eine Reihe von HTML-Blöcke haben - sagen wir etwa 50 von ihnen - die iterativ analysiert werden und haben Audio Objekte dynamisch hinzugefügt:IE 9 und 10 Ausbeute unerwartet und inkonsistent MediaError des

var SomeAudioWrapper = function(name) { 

    this.internal_player = new Audio(); 

    this.internal_player.src = this.determineSrcFromName(name); 
    // ultimately an MP3 

    this.play = function() { 
    if (someOtherConditionsAreMet()) { 
     this.internal_player.play(); 
    } 
    } 

} 

Angenommen, wir erzeugen über 40 bis 80 davon beim Seitenladen, aber immer gleich für eine bestimmte Konfiguration eingestellt. In allen getesteten Browsern scheint diese grundlegende Strategie zu funktionieren. Das Audio lädt und spielt erfolgreich.

In IE 9 und 10, ein transient Bug Oberflächen. Gelegentlich schlägt der Aufruf .play() auf dem inneren Audio Objekt fehl. Bei der Inspektion hat das innere Audio Objekt eine .error.code von 4 (MEDIA_ERR_SRC_NOT_SUPPORTED). Die Datei .duration zeigt NaN.

Dies geschieht jedoch nur gelegentlich und zu einer zufälligen Teilmenge der Audiodateien. ZB normalerweisefile_abc.mp3 spielt, aber manchmal erzeugt es den Fehler. Der Netzwerkmonitor zeigt in beiden Fällen einen erfolgreichen Download an. Und versucht, die Datei erneut zu laden über die Konsole auch nicht - und keine Anforderungen erscheint im IE-Netzwerkmonitor:

var a = new Audio(); 
a.src = "the_broken_file.mp3"; 
a.play(); // fails 
a.error.code; // 4 

Auch eine Abfrage Wert Anhängen nicht die Audio erneut abzurufen oder alle Netzwerkanfragen auslösen:

var a = new Audio(); 
a.src = "the_broken_file.mp3?v=12345"; 
a.play(); // fails 
a.error.code; // 4 

Versuchen Sie jedoch, die defekte Audiodatei in einer neuen Registerkarte mit dem gleichen Code laden funktioniert: die "nicht unterstützte src" spielt perfekt.

Gibt es Ressourcenbeschränkungen, die wir treffen könnten? (Vielleicht endet der "nicht unterstützte" Ton mit dem Download zu spät?) Gibt es bekannte Fehler? Problemumgehungen?

Ich denke, wir können ziemlich leicht erkennen, wenn eine Datei fehlschlägt. Aus anderen Kompatibilitätsgründen führen wir eine Schleife aus, um den Audiofortschritt und die Abschlussstatistiken zu überprüfen, um eine Progression durch die App (eine Bewertung) zu verhindern, bis der Ton vollständig ist. Wir könnten leicht nach .error Werten suchen - aber wenn wir eins finden, was machen wir dann?

Nachtrag: Ich habe gerade eine ähnliche Frage (IE 9/10/11 sound file limit), dass es ein nicht dokumentierte Limit von 41 schon sagt - nicht sicher, ob die „41 In-Memory-Audio-Objekte“ eine Grenze von „für Audio-Dateien 41 Anfragen“ ist oder was. Ich habe noch keine M $ -Dokumentation zu diesem Thema gefunden - oder bekannte Lösungen.

Antwort

2

Haben Sie diese Seiten in den Audiodatei-Grenzen innerhalb von IE gesehen? Diese sind spezifisch für Sound.js, aber die Informationen können auf Ihr Problem anwendbar:

https://github.com/CreateJS/SoundJS/issues/40 ...

Mögliche Lösung wie erwähnt im letzten Kommentar: „steuern die maximale Anzahl von Audio-Tags in Abhängigkeit von der Plattform und Wiederverwendung diese anstatt sie neu zu erstellen“

Zusätzliche Informationen: http://community.createjs.com/kb/faq/soundjs-faq (siehe den Abschnitt‚ich habe eine Menge Sounds laden, warum in Fehler in Internet Explorer leite‘?)

+0

Chris hat Recht, das ist wahrscheinlich, was Ihr Problem verursacht. Eine andere Lösung ist die Verwendung von [audio sprites] (http://blog.createjs.com/audio-sprite-support-in-soundjs/), die zur NEXT-Version von [SoundJS auf github] hinzugefügt wurden (https://github.com/CreateJS/SoundJS/). Hoffe, dass hilft. – OJay

0

ich das nicht erlebt haben Problem in Edge oder IE11. Aber ich habe eine JavaScript-Datei geschrieben, um einige Tests durchzuführen, indem ich 200 Audiodateien durchblättere und sehe, was passiert.Was ich gefunden habe, ist, dass das Problem für IE9 und IE10 zwischen ALLEN Tabs konsistent ist. Sie können also nicht einmal 41 Dateien laden, wenn auf anderen Tabs Audio geöffnet ist.

Die App, an der ich gerade arbeite, hat einen benutzerdefinierten Soundmanager. Unsere Lösung ist für IE9 und IE10 Vorbelastung Audio zu deaktivieren (nur bei Bedarf geladen werden) und dann, wenn die onended oder OnPause Rückruf ausgelöst wird, laufen:

this.src = '';

Dadurch wird die Anzahl der Audio-frei zu machen, die in IE enthalten. Obwohl ich warnen sollte, dass es eine Anfrage an die aktuelle Seite stellen kann, auf der sich der Benutzer befindet. Wenn die Wiedergabemethode im Soundmanager erneut aufgerufen wird, stellen Sie den src ein und spielen Sie ihn ab.

Ich habe diesen Code nicht getestet, aber ich schrieb etwas ähnliches, das funktioniert. Was ich denke, dass Sie für Ihre Implementierung tun könnten, ist das Problem zu lösen, indem Sie eine Lösung wie folgt verwenden:

var isIE = window.navigator.userAgent.match(/MSIE (9|10)/); 

var SomeAudioWrapper = function(name) { 
    var src = this.determineSrcFromName(name); 

    this.internal_player = new Audio(); 

    // If the browser is IE9 or IE10, remove the src when the 
    // audio is paused or done playing. Otherwise, set the src 
    // at the start. 
    if (isIE) { 
    this.internal_player.onended = function() { 
     this.src = ''; 
    }; 
    this.internal_player.onpause = this.internal_player.onended; 
    } else { 
    this.internal_player.src = src; 
    } 

    this.play = function() { 
    if (someOtherConditionsAreMet()) { 
     // If the browser is IE, set the src before playing. 
     if (isIE) { 
      this.internal_player.src = src; 
     } 

     this.internal_player.play(); 
    } 
    } 

}