您的應用程式可能會想知道聲音何時停止播放,這樣它才可以開始播放另一個聲音,或是清除在先前播放期間所使用的某些資源。當 SoundChannel 類別的聲音完成播放時,此類別就會傳送
Event.SOUND_COMPLETE
事件。您的應用程式可以偵聽此事件並採取適當的行動,如下所示:
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.");
}
SoundChannel 類別在播放期間不會傳送進度事件。若要報告播放進度,應用程式可以設定自己的時間機制,並追蹤聲音播放磁頭的位置。
若要計算已播放的聲音百分比,您可以將
SoundChannel.position
屬性的值除以正在播放的聲音資料長度:
var playbackPercent:uint = 100 * (channel.position / snd.length);
不過,只有聲音資料在播放開始之前就已完全載入的情況下,此程式碼才會報告精確的播放百分比。
Sound.length
屬性會顯示目前載入的聲音資料大小,而不是整個聲音檔案的最終大小。若要追蹤仍然繼續在載入的串流聲音之播放進度,您的應用程式應該估計完整聲音檔案的最終大小,並在上述計算方式中使用該值。您可以使用 Sound 物件的
bytesLoaded
與
bytesTotal
屬性,估算聲音資料的最終長度,如下所示:
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
下列程式碼會載入較大的聲音檔案,然後使用
Event.ENTER_FRAME
事件做為其計時機制,以顯示播放進度。它會定期報告播放百分比,而計算方式是以目前的位置值除以聲音資料的總長度:
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);
}
在聲音資料開始載入之後,此程式碼會呼叫
snd.play()
方法,並將產生的 SoundChannel 物件儲存在
channel
變數中。接著,它會將事件偵聽程式加入
Event.ENTER_FRAME
事件的主要應用程式,並將另一個事件偵聽程式加入在播放完成時所發生之
Event.SOUND_COMPLETE
事件的 SoundChannel 物件。
每次應用程式到達其動畫中的新影格時,就會呼叫
onEnterFrame()
方法。
onEnterFrame()
方法會根據已經載入的資料量,估算聲音檔案的總長度,然後計算並顯示目前的播放百分比。
當整段聲音都已經播放時,就會執行
onPlaybackComplete()
方法,以移除
Event.ENTER_FRAME
事件的事件偵聽程式,這樣它才不會在播放完之後嘗試顯示進度更新。
每秒可以傳送許多次
Event.ENTER_FRAME
事件。在某些情況下,您不會想要這麼頻繁地顯示播放進度。在這些情況下,您的應用程式就可以使用 flash.util.Timer 類別來設定自己的計時機制。請參閱
使用日期與時間
。