アプリケーションは、別のサウンドを再生、または前回の再生で使用されたリソースの一部をクリーンアップするため、サウンドの再生が停止したタイミングを認識する必要がある場合もあります。 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 クラスは、再生中には progress イベントを送出しません。再生の進行状況を報告するために、アプリケーションで独自のタイミングメカニズムを設定してサウンド再生ヘッドの位置を追跡できます。
サウンドの再生済みの割合を計算するには、
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
イベントは、1 秒間に何度も送出することができます。場合によっては、頻繁に再生の進行状況を表示しないこともあります。そのような場合は、flash.util.Timer クラスを使用して独自のタイミング制御メカニズムを設定することができます。詳しくは、
日付と時刻の操作
を参照してください。