Ładowanie zewnętrznych plików dźwiękowych

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Każda instancja klasy Sound odpowiada za ładowanie i wyzwalanie odtwarzania konkretnego zasobu dźwiękowego. Aplikacja nie może użyć obiektu Sound ponownie w celu załadowania więcej niż jednego dźwięku. W przypadku chęci załadowania do nowego zasobu dźwiękowego powinien zostać utworzony nowy obiekt Sound.

W przypadku ładowania niewielkiego pliku dźwiękowego, takiego jak dźwięk kliknięcia podpinany pod przycisk, aplikacja może utworzyć nowy obiekt Sound i załadować za jego pośrednictwem plik dźwiękowy, zgodnie z poniższym przykładem:

var req:URLRequest = new URLRequest("click.mp3"); 
var s:Sound = new Sound(req);

Konstruktor Sound() przyjmuje jako swój pierwszy parametr obiekt URLRequest. W przypadku dostarczenia wartości dla parametru URLRequest nowy obiekt Sound rozpoczyna ładowanie określonego zasobu dźwiękowego automatycznie.

Niemal we wszystkich, poza najprostszymi, przypadkach aplikacja powinna kontrolować postęp ładowania dźwięku oraz ewentualne występowanie błędów. Na przykład, jeśli dźwięk kliknięcia jest dość duży, może on nie zostać całkowicie załadowany do chwili kliknięcia przycisku przez użytkownika aplikacji, co z kolei powoduje wyzwolenie dźwięku. Próba odtworzenia niezaładowanego dźwięku może skończyć się błędem wykonywania. Bezpieczniej jest odczekać na całkowite załadowanie dźwięku przed umożliwieniem użytkownikom podejmowania działań, które mogłyby spowodować odtwarzanie dźwięku.

Obiekt Sound dysponuje pewną liczbę różnych zdarzeń w procesie ładowania dźwięku. Aplikacja może wykrywać te zdarzenia w celu śledzenia postępu ładowania oraz stwierdzenia, czy dźwięk został całkowicie załadowany, przed jego odtworzeniem. W poniższej tabeli wymieniono zdarzenia, które mogą być dysponowane przez obiekt Sound.

Zdarzenie

Opis

open ( Event.OPEN )

Dysponowane tuż przed rozpoczęciem operacji ładowania.

progress ( ProgressEvent.PROGRESS )

Dysponowane okresowo w trakcie procesu ładowania dźwięku podczas odbierania danych z pliku lub strumienia.

id3 ( Event.ID3 )

Dysponowane, gdy dane ID3 stają się dostępne dla dźwięku mp3.

complete ( Event.COMPLETE )

Dysponowane po załadowaniu wszystkich danych zasobów dźwiękowych.

ioError ( IOErrorEvent.IO_ERROR )

Dysponowane, jeśli nie można zlokalizować pliku dźwiękowego lub w przypadku przerwania procesu ładowania przed odebraniem wszystkich danych dźwiękowych.

Poniższy kod ilustruje sposób odtwarzania dźwięku po zakończeniu jego ładowania:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(Event.COMPLETE, onSoundLoaded); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
}

Po pierwsze próbka kodu tworzy nowy obiekt Sound bez przekazywania do niego początkowej wartości dla parametru URLRequest. Następnie wykrywa ona zdarzenie Event.COMPLETE z obiektu Sound, co powoduje wykonanie metody onSoundLoaded() po załadowaniu wszystkich danych dźwiękowych. Następnie wywołuje ona metodę Sound.load() z użyciem nowej wartości URLRequest dla pliku dźwiękowego.

Metoda onSoundLoaded() wykonywana jest po ukończeniu ładowania dźwięku. Właściwość target obiektu Event stanowi odwołanie do obiektu Sound. Wywołanie metody play() obiektu Sound uruchamia wówczas odtwarzanie dźwięku.

Monitorowanie procesu ładowania dźwięku

Pliki dźwiękowe mogą być bardzo duże, a ich załadowanie może zająć sporo czasu. Ponieważ gdy aplikacja Flash Player oraz AIR umożliwiają odtwarzanie dźwięków przez aplikację jeszcze przed ich pełnym załadowaniem, może być wskazane informowanie użytkownika o ilości załadowanych danych dźwiękowych oraz ilości dźwięku, który już został odtworzony.

Klasa Sound dysponuje dwa zdarzenia relatywnie ułatwiające wyświetlanie postępów ładowania dźwięku: ProgressEvent.PROGRESS i Event.COMPLETE . Poniższy przykład ilustruje sposób, w jaki te zdarzenia wyświetlają informacje o postępie dotyczącym ładowanych dźwięków:

import flash.events.Event; 
import flash.events.ProgressEvent; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); 
s.addEventListener(Event.COMPLETE, onLoadComplete); 
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onLoadProgress(event:ProgressEvent):void 
{ 
    var loadedPct:uint =         Math.round(100 * (event.bytesLoaded / event.bytesTotal)); 
    trace("The sound is " + loadedPct + "% loaded."); 
} 
 
function onLoadComplete(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
} 
function onIOError(event:IOErrorEvent) 
{ 
    trace("The sound could not be loaded: " + event.text); 
}

Niniejszy kod przede wszystkim tworzy obiekt Sound, a następnie dodaje do niego moduły wykrywania zdarzeń dla zdarzeń ProgressEvent.PROGRESS i Event.COMPLETE . Po wywołaniu metody Sound.load() i odebraniu pierwszych danych z pliku dźwiękowego występuje zdarzenie ProgressEvent.PROGRESS wyzwalające metodę onSoundLoadProgress() .

Wartość procentowa załadowanych danych dźwiękowych jest równa wartości właściwości bytesLoaded obiektu ProgressEvent podzielonej przez wartość właściwości bytesTotal . Te same właściwości bytesLoaded oraz bytesTotal są również dostępne w obiekcie Sound. Przykład powyżej stanowi prostą ilustrację komunikatu dotyczącego postępu ładowania dźwięku, lecz jego wartości bytesLoaded oraz bytesTotal można też w prosty sposób użyć do aktualizacji składników paska postępu, takich jak te dołączane do struktury Adobe Flex lub narzędzia do tworzenia treści Adobe Flash.

Ponadto przykład ten ilustruje sposób rozpoznawania przez aplikację i reagowania na błędy podczas ładowania plików dźwiękowych. Na przykład, jeśli nie można zlokalizować pliku dźwiękowego o danej nazwie pliku, dysponowane jest przez obiekt Sound zdarzenie Event.IO_ERROR . W poprzednim kodzie metoda onIOError() wykonuje i wyświetla krótki komunikat o błędzie podczas jego wystąpienia.