トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

サウンド_Flex

サウンド

mp3の音データの再生(BGM/SEどっちでも)を行うことができます。また、複数の音を同時に鳴らすことも可能です。

flex2からflex3に移行するにあたって、この仕様が変わったみたいですのでここではflex3のルールにて記載しています。

指定のURLのmp3を鳴らす

セキュリティの制限上、ネットワークを介した場合は許可が与えられていない再生はできないようです(後で情報追加)。

ローカルだと問題ないですので、そのときのサウンド再生方法について記載します。

なお、

import flash.events.*;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.net.URLRequest;

の指定をソースのはじめのほうでしておく必要があります。

package {
   import flash.display.*;
   import flash.utils.*;
   import flash.geom.*;
   import flash.text.*;    
   import flash.events.*;
   import flash.media.Sound;
   import flash.media.SoundChannel;
   import flash.media.SoundTransform;
   import flash.net.URLRequest;

   public class SoundTest extends Sprite {
       private var m_text:TextField;

       private var m_soundFactory:Sound;               ///< サウンドデータ
       private var m_soundChannel:SoundChannel;        ///< サウンド再生用

       public function SoundTest() {
           // テキストの作成
           m_text = new TextField();
           m_text.text = "";
           m_text.autoSize  = "left";
           m_text.multiline = true;
           m_text.x = 0;
           m_text.y = 0;
           
           addChild(m_text);       // ルートのSpriteにオブジェクトを追加
           
           // 外部mp3よりSoundを生成
           var request:URLRequest = new URLRequest("test.mp3");
           
           m_soundFactory = new Sound();
           
           // サウンド読み込みイベントの割り当て
           m_soundFactory.addEventListener(Event.COMPLETE, onSoundLoadComplete);
           m_soundFactory.addEventListener(IOErrorEvent.IO_ERROR, onSoundLoadIOError);
           m_soundFactory.addEventListener(ProgressEvent.PROGRESS, onSoundLoadProgress);
           m_soundFactory.load(request);       // 指定のmp3を読み込み

           // 再生処理
           m_soundChannel = m_soundFactory.play();

           // 音量とパンの設定
           var transform:SoundTransform;
           transform = new SoundTransform();
           transform.pan    = 0.0;         // パンは0が中心(-1.0 〜 1.0)
           transform.volume = 1.0;         // 1.0でフルボリューム (0.0 〜 1.0)
           m_soundChannel.soundTransform = transform;

           // 再生時のイベント割り当て
           m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
       }

       /**
        * サウンドの読み込みが完了した
        */
       private function onSoundLoadComplete(event:Event):void {
           m_text.appendText("\nサウンドの読み込みに成功しました。");
       }

       /**
        * サウンドの読み込みに失敗した
        */
       private function onSoundLoadIOError(event:Event):void {
           m_text.appendText("\nサウンドの読み込みに失敗しました。");
       }

       /**
        * サウンドの読み込み状態を取得
        */
       private function onSoundLoadProgress(event:ProgressEvent):void {
           m_text.appendText("\nサウンドデータ読み込み中 ..." + 
              String(event.bytesLoaded) + "/" + String(event.bytesTotal));
       }

       /**
        * サウンドの再生終了を取得
        */
       private function onSoundComplete(event:Event):void {
           // 終了したSoundChannelを判定
           if(m_soundChannel == event.target) {
               m_text.appendText("\nサウンドの再生が完了しました。");
           }
       }
   }
}

「test.mp3」というファイルがswfファイルと同じディレクトリにあるとします。

Soundクラスにてmp3ファイルを読み込み

mp3ファイルは容量が大きいことが多々ありますので、読み込みの進行を把握できたほうがいいですよね。

「new Sound()」でサウンド読み込みクラスを作成し、「addEventListener」にて各種イベントを登録、「m_soundFactory.load(request);」にてrequestで指定したmp3を読み込みます。

// 外部mp3よりSoundを生成
var request:URLRequest = new URLRequest("test.mp3");
           
m_soundFactory = new Sound();
           
// サウンド読み込みイベントの割り当て
m_soundFactory.addEventListener(Event.COMPLETE, onSoundLoadComplete);
m_soundFactory.addEventListener(IOErrorEvent.IO_ERROR, onSoundLoadIOError);
m_soundFactory.addEventListener(ProgressEvent.PROGRESS, onSoundLoadProgress);

m_soundFactory.load(request);       // 指定のmp3を読み込み

それぞれのイベントの意味は以下のようになります。

イベント内容
Event.COMPLETE読み込みが完了したときに呼ばれる
IOErrorEvent.IO_ERROR読み込みに失敗した
ProgressEvent.PROGRESS読み込みの途中経過を得るときに呼ばれる

第二引数で指定しているイベント関数の書式は以下のようになります。

/**
 * サウンドの読み込みが完了した
 */
private function onSoundLoadComplete(event:Event):void {
}
 
/**
 * サウンドの読み込みに失敗した
 */
private function onSoundLoadIOError(event:Event):void {
}
 
/**
 * サウンドの読み込み状態を取得
 */
private function onSoundLoadProgress(event:ProgressEvent):void {
}

「ProgressEvent.PROGRESS」で呼ばれるイベント関数の場合だけ、関数の第一引数の型が「ProgressEvent」となっています。

ProgressEventの「bytesLoaded」が読み込みが完了したバイト数、「bytesTotal」が読み込む予定の総バイト数、となります。「ProgressEvent.PROGRESS」のイベントは複数回呼ばれます(mp3ファイルのサイズが大きいほど、呼ばれる回数が増える)。これで、何パーセント読み込まれたか、判断できそうですね。

「Event.COMPLETE」で指定したイベント関数が呼ばれると読み込みは完了です。

「IOErrorEvent.IO_ERROR」で指定したイベント関数が呼ばれると、mp3ファイルが存在しないか読み込みに失敗した、ということになります。

サウンドの再生

m_soundChannel = m_soundFactory.play();

にてサウンドを再生します。戻り値としてSoundChannelクラスが返ります。これより、音量やパンの調整、再生完了イベントの割り当てを行います。

パンとボリュームの調整

var transform:SoundTransform;
transform = new SoundTransform();
transform.pan    = 0.0;         // パンは中心(-1 〜 +1)
transform.volume = 1.0;         // フルボリューム
m_soundChannel.soundTransform = transform;

新しく「SoundTransform」クラスを作成し、「transform.pan」にパンの値を-1.0〜1.0の数値にて指定します。-1.0が左寄り、0.0が中央、1.0が右寄り、になります。

「transform.volume」にてボリューム値を0.0〜1.0の数値にて指定します。1.0が最大です。

この作成したtransformを「m_soundChannel.soundTransform」に代入すると、パンとボリューム値が変更されます。

再生完了イベントの指定

「addEventListener」にて、再生が完了したときに第二引数で指定したイベント関数が呼ばれるようにします。

m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);

関数は以下のような書式になります。

private function onSoundComplete(event:Event):void {
}

ここで、event.targetに再生が完了したSoundChannelが入っています。複数のmp3を再生している場合は、

if(m_soundChannel == event.target) {
}

の判断を行うことにより、特定のmp3の再生完了を知ることができます。

また、これを使用して、完了後に再度

if(m_soundChannel == event.target) {
   m_soundChannel = m_soundFactory.play();
   m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
}

を呼ぶとループ再生できます(BGMの場合に使えます)。

Soundクラスのplayを呼んだ場合、再びイベント登録やSoundTransformでのパンとボリューム設定を行う必要があります。

mp3をswfファイルに埋め込む

今までの説明は外部のmp3を読み込む場合の例でしたが、今度はswfファイルにmp3を埋め込んでしまいます。これにより、1つのswfファイルだけ持ち運べばよいので楽なんですが、ファイルサイズはmp3のサイズ分増えます。

package {
   import flash.display.*;
   import flash.utils.*;
   import flash.geom.*;
   import flash.text.*;    
   import flash.events.*;
   import flash.media.Sound;
   import flash.media.SoundChannel;
   import flash.media.SoundTransform;
   import flash.net.URLRequest;

   public class SoundTest extends Sprite {
       private var m_text:TextField;

       // 読み込む外部mp3を指定 ==> sound0
       [Embed(source='test.mp3')]
       private var sound0:Class;

       private var m_soundFactory:Sound;               ///< サウンドデータ
       private var m_soundChannel:SoundChannel;        ///< サウンド再生用

       public function SoundTest() {
           // テキストの作成
           m_text = new TextField();
           m_text.text = "";
           m_text.autoSize  = "left";
           m_text.multiline = true;
           m_text.x = 0;
           m_text.y = 0;
           
           addChild(m_text);       // ルートのSpriteにオブジェクトを追加
           
           // 埋め込みサウンド
           m_soundFactory = new sound0() as Sound;
           
           // 再生処理
           m_soundChannel = m_soundFactory.play();

           // 音量とパンの設定
           var transform:SoundTransform;
           transform = new SoundTransform();
           transform.pan    = 0.0;         // パンは中心(-1 〜 +1)
           transform.volume = 1.0;         // フルボリューム
           m_soundChannel.soundTransform = transform;

           // 再生時のイベント割り当て
           m_soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
       }

       /**
        * サウンドの再生終了を取得
        */
       private function onSoundComplete(event:Event):void {
           // 終了したSoundChannelを判定
           if(m_soundChannel == event.target) {
               m_text.appendText("\nサウンドの再生が完了しました。");              
           }
       }
   }
}
[Embed(source='test.mp3')]
private var sound0:Class;

にて「test.mp3」を埋め込みます。

これを使って

m_soundFactory = new sound0() as Sound;

としてSoundクラスとして埋め込んだsound0にてnewします。この場合は、SoundクラスのaddEventListener関数での読み込みチェックイベントなどは(埋め込まれているゆえに)不要になります。

後は、

m_soundChannel = m_soundFactory.play();

として再生です。この後は、外部のmp3を処理したときと同じになります。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.