Läsa in externa ljudfiler
Flash Player 9 och senare, Adobe AIR 1.0 och senare
Varje instans av klassen Sound finns för att läsa in och aktivera uppspelningen av ett specifikt ljudobjekt. Ett program kan inte återanvända ett Sound-objekt eller läsa in fler än ett ljud. Om ett nytt ljudobjekt ska läsas in måste ett nytt Sound-objekt skapas.
Om du läser in en liten ljudfil, t.ex. ett klickljud till en knapp, kan programmet skapa ett nytt Sound-objekt och automatiskt läsa in ljudfilen enligt exemplet nedan:
var req:URLRequest = new URLRequest("click.mp3");
var s:Sound = new Sound(req);
Sound()-konstruktorn accepterar ett URLRequest-objekt som sin första parameter. När ett värde för URLRequest-parametern finns, börjar det nya Sound-objektet läsa in det specificerade ljudobjektet automatiskt.
I alla förutom de enklaste fallen, bör programmet bevaka ljudinläsningsprocessen för att upptäcka fel under inläsningen. Om ljudet är ganska stort kanske det inte har lästs in fullständigt när användaren klickar på knappen som aktiverar ljudet. Om du försöker spela upp ett ljud som inte är inläst kan det orsaka körningsfel. Det är säkrare att vänta tills ljudinläsningen är slutförd innan användarna får utföra åtgärder som kan starta uppspelning av ljudet.
Ett Sound-objekt skickar ett antal olika händelser under ljudinläsningsprocessen. Programmet kan avlyssna dessa händelser för att spåra inläsningsprocessen och säkerställa att ljudet är fullständigt inläst innan uppspelningen. Följande tabell visar vilka händelser som kan skickas av ett Sound-objekt.
Händelse
|
Beskrivning
|
open (Event.OPEN)
|
Skickas precis innan ljudinläsningsåtgärden startar.
|
progress (ProgressEvent.PROGRESS)
|
Skickas då och då under ljudinläsningsprocessen när data hämtas från filen eller strömmen.
|
id3 (Event.ID3)
|
Skickas när ID3-data finns tillgängliga för ett MP3-ljud.
|
complete (Event.COMPLETE)
|
Skickas när alla ljudresursdata är fullständigt inlästa.
|
ioError (IOErrorEvent.IO_ERROR)
|
Skickas när en ljudfil inte kan hittas eller när inläsningsprocessen avbryts innan alla ljuddata har mottagits.
|
Följande kod visar hur du spelar upp ett ljud när det är fullständigt inläst:
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();
}
Först skapas ett nytt Sound-objekt i kodexemplet utan att det får ett initialt värde för URLRequest-parametern. Sedan avlyssnar det Event.COMPLETE-händelsen från Sound-objektet som startar körningen av onSoundLoaded()-metoden när alla ljuddata är inlästa. Härefter anropas Sound.load()-metoden med ett nytt URLRequest-värde för ljudfilen.
Metoden onSoundLoaded() körs när ljudet är fullständigt inläst. Egenskapen target för Event-objektet är en referens till Sound-objektet. Sedan startas ljuduppspelningen med ett anrop till play()-metoden för Sound-objektet.
Övervaka ljudinläsningsprocessen
Ljudfiler kan vara mycket stora och ta lång tid att läsa in. Eftersom du kan spela upp ljud i Flash Player och AIR innan det är fullständigt inläst, kanske du vill visa användaren hur mycket ljuddata som har lästs in och hur mycket av ljudet som redan har spelats upp.
Klassen Sound skickar två händelser som gör det relativt enkelt att visa inläsningsförloppet för ett ljud: ProgressEvent.PROGRESS och Event.COMPLETE. I följande exempel visas hur du använder dessa händelser för att visa information om förloppet för det ljud som läses in:
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);
}
Först skapar koden ett Sound-objekt och lägger sedan till avlyssnare i objektet för händelserna ProgressEvent.PROGRESS och Event.COMPLETE. När Sound.load()-metoden har anropats och första data har mottagits från ljudfilen, inträffar en ProgressEvent.PROGRESS-händelse som aktiverar onSoundLoadProgress()-metoden.
Procentsatsen för ljuddata som har lästs in är lika med värdet för bytesLoaded-egenskapen i ProgressEvent-objektet delat med värdet för bytesTotal-egenskapen. Samma bytesLoaded- och bytesTotal-egenskaper finns också tillgängliga i Sound-objektet. I exemplet ovan visas endast meddelanden om ljudinläsningsförloppet, men du kan enkelt använda bytesLoaded- och bytesTotal-värdena för uppdatering av komponenter i förloppsindikatorn, t.ex. de som finns i Adobe Flex Framework eller Adobe Flash-utvecklingsverktyget.
I det här exemplet visas även hur ett program kan identifiera och svara på ett fel under inläsning av ljudfiler. Om t.ex. en ljudfil med ett visst filnamn inte kan hittas, skickar Sound-objektet en Event.IO_ERROR-händelse. I föregående kod körs onIOError()-metoden och visar ett kort felmeddelande när ett fel uppstår.