サウンドの再生

Flash Player 9 以降、Adobe AIR 1.0 以降

次に示すように、読み込んだサウンドは Sound オブジェクトの Sound.play() メソッドを呼び出すだけで再生できます。

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

ActionScript 3.0 を使用してサウンドを再生しているときに、次の操作を実行することができます。

  • 特定の開始位置からサウンドを再生する

  • サウンドを一時停止し、後で同じ位置から再生を再開する

  • サウンドの再生が終了する正確な時間を知る

  • サウンドの再生の進行状況を追跡する

  • サウンドの再生中に音量またはバランスを変更する

再生中にこれらの操作を実行するには、SoundChannel、SoundMixer、SoundTransform の各クラスを使用します。

SoundChannel クラスは、単一のサウンドの再生を制御します。 SoundChannel.position プロパティは再生ヘッドと考えることができ、サウンドデータ内で再生中の現在位置を示します。

アプリケーションが Sound.play() メソッドを呼び出すと、再生を制御するために SoundChannel クラスの新しいインスタンスが作成されます。

アプリケーションは Sound.play() メソッドの startTime パラメーターとして、ミリ秒の単位で表した特定の開始位置を渡すことで、その位置からサウンドを再生できます。また、 Sound.play() メソッドの loops パラメーターで数値を渡すことで、間を置かずにサウンドを繰り返して再生する固定回数を指定できます。

startTime パラメーターおよび loops パラメーターと共に Sound.play() メソッドが呼び出されると、次のコードに示すように、同じ開始位置からサウンドが繰り返し再生されます。

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

この例では、サウンドの先頭から 1 秒後の位置から連続して 3 回、サウンドを再生します。

サウンドの一時停止と再開

歌やポッドキャストのような長いサウンドをアプリケーションで再生する場合、通常は、ユーザーがサウンドの再生を一時停止および再開できるようにする必要があります。サウンドは、ActionScript での再生中は文字どおり一時停止することはできません。サウンドは停止されるだけです。 ただし、サウンドの再生はどこからでも開始できます。サウンドを停止した位置を記録しておき、後でその位置からサウンドの再生を開始できます。

例えば、次のようなサウンドファイルを読み込んで再生するコードがあるとします。

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

サウンドの再生中、 SoundChannel.position プロパティは再生中のサウンドファイルの位置を示します。アプリケーションでは次のようにして、サウンドの再生を停止する前に位置の値を保存できます。

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

サウンドの再生を再開するには、保存しておいた位置の値を渡します。サウンドは停止したときと同じ位置から再開されます。

channel = snd.play(pausePosition);

再生の監視

アプリケーションは、別のサウンドを再生、または前回の再生で使用されたリソースの一部をクリーンアップするため、サウンドの再生が停止したタイミングを認識する必要がある場合もあります。 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 クラスを使用して独自のタイミング制御メカニズムを設定することができます。詳しくは、 日付と時刻の操作 を参照してください。

ストリーミングサウンドの停止

ストリーミング中のサウンド、つまり再生中にまだ読み込まれているサウンドの再生処理では、他の場合とは異なる動作が発生します。ストリーミングサウンドを再生している SoundChannel インスタンスで SoundChannel.stop() メソッドが呼び出されると、サウンドの再生は 1 フレーム分停止し、次のフレームでサウンドを最初から再開します。このようなことが発生するのは、サウンドの読み込み処理が進行中であるためです。ストリーミングサウンドの読み込みと再生の両方を停止するには、 Sound.close() メソッドを呼び出します。