再生の監視

アプリケーションでは、別のサウンドを再生、または前回の再生で使用されたリソースの一部をクリーンアップするため、サウンドの再生がいつ停止されるかを把握する必要がある場合もあります。SoundChannel クラスは、サウンドが再生を終了したときに Event.SOUND_COMPLETE イベントを送出します。アプリケーションは、このイベントを監視し、次のような適切なアクションを実行することができます。

import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;

var snd:Sound = new Sound("smallSound.mp3");
var channel:SoundChannel = snd.play();
s.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);
snd.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 クラスを使用して独自のタイミング制御メカニズムを設定することができます。詳しくは日付と時刻の操作を参照してください。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000291.html