Geluiden afspelen

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Het afspelen van een geladen geluid kan eenvoudig worden bereikt door de methode Sound.play() voor een object Sound aan te roepen. Dit doet u als volgt:

var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); 
snd.play();

Bij het afspelen van geluiden met behulp van ActionScript 3.0 kunt u de volgende bewerkingen uitvoeren:

  • Een geluid afspelen vanaf een specifieke startpositie

  • Een geluid onderbreken en het afspelen later vanaf hetzelfde punt hervatten

  • Precies nagaan wanneer het afspelen van een geluid wordt voltooid

  • De voortgang van het afspelen van een geluid volgen

  • Volume of panning wijzigen tijdens het afspelen van een geluid

Als u deze bewerkingen tijdens het afspelen wilt uitvoeren, gebruikt u de klassen SoundChannel, SoundMixer en SoundTransform.

De klasse SoundChannel bestuurt het afspelen van één geluid. De eigenschap SoundChannel.position kan worden beschouwd als een afspeelkop, waarmee de huidige positie binnen de afgespeelde geluidsgegevens wordt aangegeven.

Wanneer een toepassing de methode Sound.play() aanroept, wordt een nieuwe instantie van de klasse SoundChannel gemaakt om het afspelen te besturen.

Uw toepassing kan een geluid vanaf een specifieke startpositie afspelen door die positie, in milliseconden, door te geven als waarde voor de parameter startTime van de methode Sound.play() . U kunt ook opgeven dat het geluid een vast aantal maal snel na elkaar moet worden herhaald, door een numerieke waarde in de parameter loops van de methode Sound.play() door te geven.

Wanneer de methode Sound.play() wordt aangeroepen met zowel de parameter startTime als de parameter loops , wordt het geluid herhaaldelijk vanaf hetzelfde startpunt afgespeeld, zoals wordt weergegeven in de volgende code:

var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3")); 
snd.play(1000, 3);

In dit voorbeeld wordt het geluid drie keer achter elkaar afgespeeld vanaf een punt dat één seconde na het begin van het geluid ligt.

Een geluid onderbreken en hervatten

Als uw toepassing lange geluiden zoals liedjes of podcasts afspeelt, wilt u gebruikers waarschijnlijk de mogelijkheid bieden om het afspelen van deze geluiden te onderbreken en te hervatten. Een geluid kan tijdens het afspelen in ActionScript niet echt worden onderbroken, maar alleen worden gestopt. Een geluid kan echter vanaf elk gewenst punt worden afgespeeld. U kunt de positie van het geluid vastleggen op het moment van stoppen, en het geluid vervolgens later vanaf die positie weer afspelen.

Stel bijvoorbeeld dat in uw code een geluidsbestand als volgt wordt geladen en afgespeeld:

var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); 
var channel:SoundChannel = snd.play();

Terwijl het geluid wordt afgespeeld, geeft de eigenschap SoundChannel.position steeds het punt in het geluidsbestand aan dat op dat moment wordt afgespeeld. Uw toepassing kan als volgt de positiewaarde opslaan voordat wordt gestopt met het afspelen van het geluid:

var pausePosition:int = channel.position; 
channel.stop();

Als u het afspelen van het geluid wilt hervatten, geeft u de eerder opgeslagen positiewaarde door om het geluid weer te starten vanaf het punt waar het afspelen eerder is gestopt.

channel = snd.play(pausePosition);

De status van het afspelen volgen

Uw toepassing wil mogelijk weten wanneer het afspelen van een geluid wordt gestopt, om met het afspelen van een ander geluid te kunnen beginnen, of om resources vrij te maken die tijdens de eerdere afspeelbewerking werden gebruikt. De klasse SoundChannel verzendt de gebeurtenis Event.SOUND_COMPLETE wanneer het afspelen van het corresponderende geluid is voltooid. Uw toepassing kan naar deze gebeurtenis luisteren en op basis daarvan actie ondernemen, zoals hieronder wordt weergegeven:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("smallSound.mp3"); 
snd.load(req); 
 
var channel:SoundChannel = snd.play(); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
public function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
}

De klasse SoundChannel verzendt tijdens het afspelen geen voortgangsgebeurtenissen. Om melding te kunnen maken van de voortgang van het afspelen, kunt u een eigen tijdsmechanisme voor uw toepassing opzetten en de positie van de geluidsafspeelkop bijhouden.

Als u wilt berekenen welk percentage van een geluid is afgespeeld, deelt u de waarde van de eigenschap SoundChannel.position door de lengte van de geluidsgegevens die worden afgespeeld:

var playbackPercent:uint = 100 * (channel.position / snd.length);

Met deze code worden echter alleen nauwkeurige afspeelpercentages gemeld als de geluidsgegevens volledig geladen waren voordat met afspelen werd begonnen. De eigenschap Sound.length geeft de grootte van de momenteel geladen geluidsgegevens aan, niet de uiteindelijke grootte van het hele geluidsbestand. Als u de voortgang wilt bijhouden van het afspelen van een streaming geluid dat nog steeds wordt afgespeeld, moet uw toepassing een schatting maken van de uiteindelijke grootte van het hele geluidsbestand en deze waarde in de berekeningen gebruiken. U kunt een schatting van de uiteindelijke lengte van de geluidsgegevens maken door als volgt gebruik te maken van de eigenschappen bytesLoaded en bytesTotal :

var estimatedLength:int =  
    Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
var playbackPercent:uint = 100 * (channel.position / estimatedLength);

Met de volgende code wordt een groter geluidsbestand geladen en wordt de gebeurtenis Event.ENTER_FRAME gebruikt als tijdsmechanisme voor weergave van de voortgang van het afspelen. Het afspeelpercentage wordt periodiek gemeld; dit wordt berekend als de huidige positiewaarde gedeeld door de totale lengte van de geluidsgegevens:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new  
    URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3"); 
snd.load(req); 
 
var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
function onEnterFrame(event:Event):void 
{ 
    var estimatedLength:int =  
        Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
    var playbackPercent:uint =  
        Math.round(100 * (channel.position / estimatedLength)); 
    trace("Sound playback is " + playbackPercent + "% complete."); 
} 
 
function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}

Nadat is gestart met het laden van de geluidsgegevens, roept deze code de methode snd.play() aan en wordt het resulterende object SoundChannel opgeslagen in de variabele channel . Vervolgens wordt er een gebeurtenislistener aan de hoofdtoepassing toegevoegd voor de gebeurtenis Event.ENTER_FRAME , en wordt een gebeurtenislistener aan het object SoundChannel toegevoegd voor de gebeurtenis Event.SOUND_COMPLETE , die optreedt zodra het afspelen is voltooid.

Steeds wanneer de toepassing een nieuw frame binnen de animatie bereikt, wordt de methode onEnterFrame() aangeroepen. De methode onEnterFrame() maakt een schatting van de totale lengte van het geluidsbestand op basis van de hoeveelheid gegevens die al zijn geladen, waarna wordt berekend en weergegeven welk percentage al is afgespeeld.

Wanneer het hele geluid is afgespeeld, wordt de methode onPlaybackComplete() uitgevoerd en wordt de gebeurtenislistener voor de gebeurtenis Event.ENTER_FRAME verwijderd, zodat er niet wordt geprobeerd om de voortgang van het afspelen te blijven bijwerken als het afspelen eenmaal is voltooid.

De gebeurtenis Event.ENTER_FRAME kan een groot aantal maal per seconde worden verzonden. In sommige gevallen zult u de voortgang van het afspelen niet zo vaak willen weergeven. In die gevallen kunt u een eigen tijdsmechanisme voor uw toepassing opzetten met behulp van de klasse flash.util.Timer; zie Werken met datums en tijden .

Gestreamde geluiden stoppen

Het afspeelproces voor gestreamde geluiden kent een eigenaardigheid. Gestreamde geluiden zijn geluiden die nog worden geladen terwijl ze al worden afgespeeld. Wanneer uw toepassing de methode SoundChannel.stop() aanroept voor een instantie SoundChannel die een streaming geluid afspeelt, wordt het afspelen van het geluid voor één frame stopgezet, waarna er bij het volgende frame weer vanaf het begin van het geluid wordt gestart. Dit gebeurt omdat het proces voor het laden van het geluid nog actief is. Als u zowel het laden als het afspelen van een streaming geluid wilt stoppen, roept u de methode Sound.close() aan.