5

Mamy zestaw bloków HTML - powiedzmy około 50 z nich - które są iteracyjnie analizowany i mieć Audio obiekty dynamicznie Dodano:IE 9 i 10 wydajność nieoczekiwane i niezgodne MediaError na

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(); 
    } 
    } 

} 

Załóżmy, że generują około 40 do 80 z nich przy ładowaniu strony, ale zawsze ten sam zestaw dla konkretnej konfiguracji. We wszystkich testowanych przeglądarkach ta podstawowa strategia wydaje się działać. Ładowanie audio i odtwarzanie powiodło się.

W 9 i 10 IE pojawia się błąd przejściowy. Czasami wywołanie obiektu .play() na wewnętrznym obiekcie kończy się niepowodzeniem. Po oględzinach, wewnętrzny obiekt ma postać .error.code z .error.code z .error.code. Plik .duration pokazuje NaN.

Jednak zdarza się to tylko sporadycznie i dla niektórych losowych podzbiorów plików audio. Np., zwyklefile_abc.mp3 odtwarza, ale czasami generuje błąd. Monitor sieci pokazuje udane pobieranie w obu przypadkach. I próbuje przeładować plik poprzez konsola również nie - i żadne prośby pojawia się w monitorze sieci IE:

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

Nawet dodanie wartości kwerenda nie powiedzie się odśwież plik audio lub wywołać jakiekolwiek żądania sieciowe:

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

Jednak próba załadowania uszkodzonego pliku audio w nowej karcie przy użyciu tego samego kodu działa: "nieobsługiwany src" jest odtwarzany idealnie.

Czy są jakieś limity zasobów, które moglibyśmy uderzyć? (Być może "nieobsługiwane" audio kończy pobieranie późno?) Czy są jakieś znane błędy? Obejścia?

Myślę, że możemy dość łatwo wykryć, kiedy plik się nie powiedzie. Z innych powodów kompatybilności uruchamiamy pętlę, aby sprawdzić postępy i statystyki postępu audio, aby zapobiec postępowi w aplikacji (ocena), dopóki dźwięk nie zostanie zakończony. Możemy łatwo szukać wartości .error - ale jeśli znajdziemy, co z tym zrobimy !?

Uzupełnienie: Właśnie znalazłem powiązane pytanie (IE 9/10/11 sound file limit), który sugeruje, że jest nieudokumentowana limit 41 - nie wiem, czy to jest limit „41 wniosków dotyczących plików audio”, „41 obiektów audio w pamięci” lub co. Muszę jeszcze znaleźć jakąkolwiek dokumentację M $ w tej sprawie - lub znane rozwiązania.

Odpowiedz

2

Czy widziałeś te strony w limitach plików audio w IE? Są to specyficzne Sound.js, ale informacje te mogą mieć zastosowanie do emisji:

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

Możliwe rozwiązanie, jak wspomniano w poprzednim komentarzu: „kontrolować maksymalną liczbę tagów dźwiękowych, stosownie do Platforma i ponowne ich zamiast je odtwarzając”

Dodatkowe informacje: http://community.createjs.com/kb/faq/soundjs-faq (patrz rozdział zatytułowany«załadować dużo dźwięków, dlaczego używam do błędów w programie Internet Explorer?»)

+0

Chris ma rację, to prawdopodobnie powoduje problem. Innym rozwiązaniem jest użycie [ikonki audio] (http://blog.createjs.com/audio-sprite-support-in-soundjs/), które zostały dodane do NEXT wersji [SoundJS dostępnej na githubie] (https://github.com/CreateJS/SoundJS/). Nadzieję, że pomaga. – OJay

0

nie doświadczyłem tego problem w Edge lub IE11. Ale napisałem plik javascript, aby uruchomić kilka testów, przechodząc przez 200 plików audio i sprawdzając, co się dzieje.Odkryłem, że problem z IE9 i IE10 jest zgodny pomiędzy wszystkimi zakładkami. Nie masz pewności, że możesz załadować 41 plików, jeśli inne karty mają otwarty dźwięk.

Aplikacja, nad którą pracuję, ma niestandardowy menedżer dźwięku. Nasze rozwiązanie jest wyłączenie wstępnego ładowania dźwięku dla IE9 i IE10 (wystarczy załadować na żądanie), a następnie, gdy onended lub OnPause zwrotna zostanie uruchomiony, aby uruchomić:

this.src = '';

To uwolni liczbę audio, które zostały zawarte w IE. Chociaż powinienem ostrzec, że może przesłać żądanie do bieżącej strony, na której znajduje się użytkownik. Gdy metoda odtwarzania w menedżerze dźwięku zostanie wywołana ponownie, ustaw src i graj.

Nie przetestowałem tego kodu, ale napisałem coś podobnego, co działa. To, co myślę, że możesz zrobić dla swojej implementacji, rozwiązuje problem, używając rozwiązania takiego jak to:

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(); 
    } 
    } 

}