Wiedergeben von Sounds

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Die Wiedergabe eines geladenen Sounds kann so einfach wie das Aufrufen der Sound.play() -Methode eines Sound-Objekts sein. Dies wird im folgenden Code gezeigt:

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

Bei der Wiedergabe von Sounds mit ActionScript 3.0 können Sie die folgenden Aktionen ausführen:

  • Wiedergeben eines Sounds ab einer bestimmten Startposition

  • Unterbrechen eines Sounds und Fortsetzen der Wiedergabe ab der gleichen Position zu einem späteren Zeitpunkt

  • Exakt wissen, wann die Wiedergabe eines Sounds beendet ist

  • Den Wiedergabefortschritt eines Sounds verfolgen

  • Die Lautstärke oder Richtungseinstellung ändern, während ein Sound wiedergegeben wird

Um diese Aktionen während der Wiedergabe auszuführen, sind die Klassen SoundChannel, SoundMixer und SoundTransform erforderlich.

Die SoundChannel-Klasse steuert die Wiedergabe eines bestimmten Sounds. Die SoundChannel.position -Eigenschaft können Sie sich als Abspielkopf vorstellen, der die aktuelle Position in den wiedergegebenen Sounddaten anzeigt.

Wenn eine Anwendung die Sound.play() -Methode aufruft, wird eine neue Instanz der SoundChannel-Klasse erstellt, mit der die Wiedergabe gesteuert wird.

Ihre Anwendung kann einen Sound ab einer bestimmten Startposition wiedergeben, indem diese Position als Wert in Millisekunden an den startTime -Parameter der Sound.play() -Methode übergeben wird. Sie kann auch einen Wert angeben, wie oft der Sound kurz hintereinander wiederholt wird, indem ein numerischer Wert im loops -Parameter der Sound.play() -Methode übergeben wird.

Wird die Sound.play() -Methode mit einem startTime -Parameter und einem loops -Parameter übergeben, wird der Sound mehrmals hintereinander ab dem gleichen Startpunkt wiedergegeben. Betrachten Sie dazu das folgende Codebeispiel:

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

In diesem Beispiel wird der Sound drei Mal hintereinander ab einem Punkt eine Sekunde nach dem Start des Sounds wiedergegeben.

Unterbrechen und Fortsetzen eines Sounds

Wenn Ihre Anwendung längere Sounds wiedergibt (wie Musikstücke oder Podcasts), sollen die Benutzern die Möglichkeit haben, die Wiedergabe dieser Sounds zu unterbrechen und fortzusetzen. Ein Sound kann während der Wiedergabe in ActionScript nicht wirklich unterbrochen, sondern nur angehalten werden. Die Wiedergabe eines Sounds kann jedoch an jedem beliebigen Punkt beginnen. Sie können die Position im Sound zum Zeitpunkt des Stoppens aufzeichnen und dann später die Wiedergabe an dieser Position fortsetzen.

Angenommen, Ihr Code lädt eine Sounddatei wie die folgende und gibt sie wieder:

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

Während der Sound wiedergegeben wird, kennzeichnet die SoundChannel.position -Eigenschaft die Stelle der Sounddatei, die gerade wiedergegeben wird. Ihre Anwendung kann den Positionswert speichern, bevor die Soundwiedergabe gestoppt wird. Dies ist z. B. mit dem folgenden Code möglich:

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

Um die Soundwiedergabe fortzusetzen, übergeben Sie den zuvor gespeicherten Positionswert, um die Soundwiedergabe am gleichen Punkt zu starten, an dem sie zuvor gestoppt wurde.

channel = snd.play(pausePosition);

Überwachen der Wiedergabe

Ihrer Anwendung muss wissen, wann ein Sound beendet ist, sodass ein weiterer Sound wiedergegeben oder bestimmte Ressourcen freigegeben werden können, die für die abgeschlossene Wiedergabe verwendet wurden. Die SoundChannel-Klasse löst ein Event.SOUND_COMPLETE -Ereignis aus, nachdem ein Sound vollständig wiedergegeben wurde. Ihre Anwendung kann auf dieses Ereignis überwachen und eine entsprechende Aktion ausführen. Betrachten Sie dazu den folgenden Beispielcode:

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."); 
}

Die SoundChannel-Klasse löst während der Wiedergabe keine Fortschrittereignisse aus. Um den Fortschritt der Wiedergabe zu melden, muss Ihre Anwendung einen eigenen Timermechanismus einrichten und die Position des Sound-Abspielkopfs verfolgen.

Zur Berechnung des Prozentsatzes, der von einem Sound wiedergegeben wurde, können Sie den Wert der SoundChannel.position -Eigenschaft durch die Länge der Sounddaten dividieren, die bereits wiedergegeben wurden:

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

Jedoch meldet dieser Code nur dann den genauen Prozentsatz der wiedergegebenen Sounddaten, wenn die Datei vollständig geladen war, bevor die Wiedergabe gestartet wurde. Die Sound.length -Eigenschaft zeigt die Größe der aktuell geladenen Sounddaten, nicht die tatsächliche Größe der gesamten Sounddatei an. Um den Fortschritt bei der Wiedergabe eines Streaming-Sounds zu verfolgen, der noch geladen wird, muss Ihre Anwendung die tatsächliche Größe der gesamten Sounddatei schätzen und diesen Wert in den Berechnungen verwenden. Sie können die tatsächliche Länge der Sounddaten mithilfe der bytesLoaded - und bytesTotal -Eigenschaften des Sound-Objekts schätzen. Dazu wird z. B. der folgende Code verwendet:

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

Mit dem folgenden Code wird eine größere Sounddatei geladen und als Timermechanismus das Event.ENTER_FRAME -Ereignis verwendet, um den Fortschritt bei der Wiedergabe anzuzeigen. Der Code meldet regelmäßig den Prozentsatz der wiedergegebenen Sounddaten, der aus dem Wert für die aktuelle Position dividiert durch die Gesamtlänge der Sounddaten berechnet wird:

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

Nachdem die Wiedergabe der Sounddaten gestartet wurde, ruft der Code die snd.play() -Methode auf und speichert das resultierende SoundChannel-Objekt in der Variablen channel . Dann fügt er der Hauptanwendung einen Ereignis-Listener für das Event.ENTER_FRAME -Ereignis und dem SoundChannel-Objekt einen weiteren Ereignis-Listener für das Event.SOUND_COMPLETE -Ereignis hinzu, das auftritt, wenn die Wiedergabe abgeschlossen ist.

Jedes Mal, wenn in die Anwendung ein neues Bild in der Animation erreicht, wird die onEnterFrame() -Methode aufgerufen. Die onEnterFrame() -Methode schätzt die Gesamtlänge der Sounddatei basierend auf der bereits geladenen Datenmenge, berechnet dann die abgeschlossene Wiedergabe und zeigt diese an.

Wenn der gesamte Sound wiedergegeben wurde, werden die onPlaybackComplete() -Methode ausgeführt und der Ereignis-Listener für das Event.ENTER_FRAME -Ereignis gelöscht, sodass es nicht versucht, den Fortschritt weiter zu aktualisieren, obwohl die Wiedergabe abgeschlossen ist.

Das Event.ENTER_FRAME -Ereignis kann mehrmals pro Sekunde ausgelöst werden. In einigen Fällen soll der Wiedergabefortschritt weniger häufig angezeigt werden. Dann kann die Anwendung mithilfe der flash.util.Timer-Klasse einen eigenen Timermechanismus einrichten. Weitere Informationen finden Sie unter Arbeiten mit Datum und Zeit .

Anhalten von Streaming-Sounds

Die Anzeige des Fortschritts bei der Wiedergabe von Streaming-Sounds (d. h. Sounds, die noch geladen werden, obwohl die Wiedergabe bereits begonnen hat), stellt einen Sonderfall dar. Wenn Ihre Anwendung die SoundChannel.stop() -Methode einer SoundChannel-Instanz aufruft, die einen Streaming-Sound wiedergibt, stoppt die Soundwiedergabe für ein Bild und startet die Soundwiedergabe dann im nächsten Bild von vorne. Dies tritt auf, da der Sound noch immer geladen wird. Um sowohl das Laden als auch die Wiedergabe eines Streaming-Sounds zu stoppen, rufen Sie die Sound.close() -Methode auf.