外部のサウンドファイルの読み込み

Flash Player 9 以降、Adobe AIR 1.0 以降

Sound クラスの各インスタンスは、特定のサウンドリソースを読み込んで再生をトリガーするために存在します。アプリケーションは、1 つの Sound オブジェクトを再利用して複数のサウンドを読み込むことはできません。新しいサウンドリソースをロードする必要がある場合は、新しい Sound オブジェクトを作成する必要があります。

ボタンに関連付けるクリック音など、小さなサウンドファイルをロードする場合、アプリケーションは新しい Sound オブジェクトを作成し、次のようにサウンドファイルを自動的にロードできます。

var req:URLRequest = new URLRequest("click.mp3"); 
var s:Sound = new Sound(req);

Sound() コンストラクターは、最初のパラメーターとして URLRequest オブジェクトを受け取ります。URLRequest パラメーターに値が渡ると、新しい Sound オブジェクトは指定されたサウンドリソースの読み込みを自動的に開始します。

最も単純なケースを除いて、アプリケーションではサウンドの読み込みの進行状況に注意し、読み込み中のエラーを監視する必要があります。例えば、クリックサウンドが比較的大きい場合、サウンドをトリガーするボタンがクリックされても、サウンドが完全にロードされていないこともあります。 読み込まれていないサウンドを再生しようとすると、ランタイムエラーが発生する場合があります。そのため、サウンドが完全にロードされてから、サウンドの再生を開始するアクションを実行する方が安全です。

Sound オブジェクトは、サウンド読み込みプロセスの間に、複数の種類のイベントを送出します。アプリケーションは、これらのイベントをリッスンして読み込みの進行状況を追跡し、サウンドが完全に読み込まれたのを確認してから再生できます。次の表は、Sound オブジェクトによって送出されるイベントをまとめたものです。

イベント

説明

open ( Event.OPEN )

サウンド読み込み操作の開始直前に送出されます。

progress ( ProgressEvent.PROGRESS )

データをファイルまたはストリームから受け取るとき、サウンド読み込み処理の間に定期的に送出されます。

id3 ( Event.ID3 )

ID3 データが MP3 サウンドで使用できるようになると送出されます。

complete ( Event.COMPLETE )

サウンドリソースの全データが読み込まれると送出されます。

ioError ( IOErrorEvent.IO_ERROR )

サウンドファイルを読み込むことができない場合、または全サウンドデータを受け取る前に読み込み処理が中断された場合に送出されます。

次のコードは、読み込みが終了した後でサウンドを再生する方法を示しています。

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(Event.COMPLETE, onSoundLoaded); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
}

まず、URLRequest パラメーターの初期値を指定せずに新しい Sound オブジェクトを作成します。その後、Sound オブジェクトの Event.COMPLETE イベントを監視し、すべてのサウンドデータがロードされると onSoundLoaded() メソッドが実行されます。次に、サウンドファイルの新しい URLRequest 値を指定して Sound.load() メソッドを呼び出します。

サウンドの読み込みが完了すると、 onSoundLoaded() メソッドを実行します。Event オブジェクトの target プロパティは、Sound オブジェクトへの参照です。Sound オブジェクトの play() メソッドを呼び出すと、サウンドの再生が開始されます。

サウンド読み込み処理の監視

サウンドファイルのサイズが大きく、ロードに時間がかかることがあります。 Flash Player および AIR では、サウンドを完全にロードしなくてもアプリケーションで再生することができます。その際に、サウンドデータがどれだけロード済みであるか、また、どれだけのサウンドが再生済みであるかを示すこともできます。

Sound クラスは、 ProgressEvent.PROGRESS および Event.COMPLETE の 2 つのイベントを送出するので、サウンドのロードの進行状況を比較的簡単に表示することができます。次の例では、これらのイベントを使用して読み込み中のサウンドに関する進行状況の情報を表示する方法を示します。

import flash.events.Event; 
import flash.events.ProgressEvent; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); 
s.addEventListener(Event.COMPLETE, onLoadComplete); 
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onLoadProgress(event:ProgressEvent):void 
{ 
    var loadedPct:uint =         Math.round(100 * (event.bytesLoaded / event.bytesTotal)); 
    trace("The sound is " + loadedPct + "% loaded."); 
} 
 
function onLoadComplete(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
} 
function onIOError(event:IOErrorEvent) 
{ 
    trace("The sound could not be loaded: " + event.text); 
}

このコードは、まず Sound オブジェクトを作成し、次に ProgressEvent.PROGRESS および Event.COMPLETE イベントのリスナーをこのオブジェクトに追加します。 Sound.load() メソッドが呼び出され、サウンドファイルから最初のデータが受信されると、 ProgressEvent.PROGRESS イベントが発生し、 onSoundLoadProgress() メソッドがトリガーされます。

ロード済みのサウンドデータの割合は、ProgressEvent オブジェクトの bytesLoaded プロパティの値を、 bytesTotal プロパティの値で除算した値に相当します。同じ bytesLoaded プロパティと bytesTotal プロパティは、Sound オブジェクトでも使用できます。上記の例は、サウンドのロードの進行状況に関するメッセージを表示するだけですが、 bytesLoaded および bytesTotal 値を使用し、Adobe Flex Framework または Adobe Flash オーサリングツールに付属しているようなプログレスバーコンポーネントを簡単に更新することもできます。

この例では、アプリケーションでサウンドファイル読み込み中のエラーを検出して対応する方法も示されています。例えば、特定のファイル名を持つサウンドファイルが見つからない場合は、Sound オブジェクトによって Event.IO_ERROR イベントが送出されます。前述のコードでは、エラーが発生すると onIOError() メソッドを実行して簡単なエラーメッセージを表示します。