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
.