2014-10-03

Flashで外部音声ファイル(wav形式)を再生

http://helpx.adobe.com/jp/flash/using/using-sounds-flash.html を読むと興味深い記述があった。

Flash Professional に読み込むことのできるサウンドファイル形式は、次のとおりです。

Adobe Sound(*.asnd)。Adobe® Soundbooth™ のネイティブサウンド形式です。 Wave(.wav) AIFF(.aif、.aifc) mp3

その他にも、以下のサウンドファイル形式を読み込むこともできます。 Sound Designer® II(.sd2) Sun AU(.au、.snd) FLAC(.flac) Ogg Vorbis(.ogg、.oga)

これはホントなのか。 oggも再生可能か試してみた。

外部mp3,wav,oggをストリーミング再生してみる

http://snipplr.com/view/31915/as3-loading-and-playing-an-external-mp3-file/ のコードを元に、以下をビルド。 swfと同じフォルダーに test.wav, test.mp3, test.oggを配置。

Main.as

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;

    /**
     * ...
     * @author foo
     */
    public class Main extends Sprite {
        private var preloadBottom:Number;

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            var snd:Sound = new Sound();
            var chnl:SoundChannel = new SoundChannel();
            snd.load(new URLRequest('test.mp3'));
            //snd.load(new URLRequest('test.ogg'));
            //snd.load(new URLRequest('test.wav'));
            snd.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
            function onComplete(e:Event):void {
                chnl = snd.play();
            }
        }
    }
}

mp3ならストリーミング再生可能。oggとwavは不可。と分かった。

ogg対応なのは、Flash Proでflaファイルにoggを内部埋め込みのときだろう。 ストリーミング(外部ファイル読み込み)だとmp3のみ使えるということだね。

実際は内部埋め込みであればmp3で問題ない。外部読み込みのときこそ、mp3以外を使いたいのだ。mp3はライセンス料問題があるからだ。

ライブラリ使用してwavとogg対応?

しかし、外部wavやoggファイルを再生する方法があるという。

外部oggファイルはよく分からず。

http://stackoverflow.com/questions/9165189/flash-as3-ogg-sound-delayed-adobe-alchemy-library http://labs.byhook.com/2011/02/22/ogg-vorbis-encoder-decoder-for-flash/ を見るとできるようだが、後者から実際にDLしてサンプルswfをローカルで動かし、ローカルのoggを再生してみたら、2m00s(2分0秒)のoggファイル(465KB)のデコードに30秒くらいかかるし、音声が2倍速で再生されてる感じ。これは常用は難しい。

as3wavsound で外部wav再生

まあwavだけでも対応してみよう。 こっちは簡単。

http://stackoverflow.com/questions/12538076/playing-successive-wav-sounds-in-as3 を参考に、FlashDevelpのsrcフォルダー以下に、as3wavsound https://code.google.com/p/as3wavsound/ を展開して出てきたsrc以下のフォルダーをcopy。 swfと同じフォルダー(bin)以下に test.wavを配置。 src/Main.asは以下。

Main.as

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
    import org.as3wavsound.WavSound;
    import org.as3wavsound.WavSoundChannel;

    /**
     * ...
     * @author foo
     */
    public class Main extends Sprite {

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            var ld:URLLoader = new URLLoader();
            ld.dataFormat = 'binary'; //この行は必要だった
            ld.load(new URLRequest('test.wav'));
            ld.addEventListener(Event.COMPLETE, onComplete);

            function onComplete(e:Event):void {
                var snd:WavSound = new WavSound(e.currentTarget.data as ByteArray);
                var chnl:WavSoundChannel = snd.play();
            }
        }
    }
}

デコード時間ほぼ無しでいきなり再生。こっちは問題なく使える。

注意すべきはwavファイルのフォーマットで 44100/22050/11025 kHz で、かつ 8/16 bitだけ対応。48000kHzや24bitはムリなのね。モノラルは再生できた。

0 件のコメント:

コメントを投稿

人気記事