In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

マイクテスト (15秒録音→ローカルに保存)

マイクの音をwavファイルとしてローカルに保存
/**
 * Copyright sakef ( http://wonderfl.net/user/sakef )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/mYKE
 */

/*
    マイクの音をwavファイルとしてローカルに保存
*/
package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.ActivityEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.SampleDataEvent;
    import flash.media.Microphone;
    import flash.net.FileReference;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.utils.ByteArray;
    import flash.utils.Endian;
    
    public class Microphone_test02 extends Sprite
    {
        // 録音時間
        private static const record:int = 15;
        
        private var mic:Microphone;
        private var micBytes:ByteArray;
        private var wavBytes:ByteArray;
        private var tf:TextField;
        private var startTIme:Number;
        
        public function Microphone_test02():void
        {
            // ステージの設定
            stage.align=StageAlign.TOP_LEFT;
            stage.scaleMode=StageScaleMode.NO_SCALE;
            
            // データを保存するByteArray
            micBytes=new ByteArray;
            
            // マイクの設定
            mic=Microphone.getMicrophone();
            mic.rate=44;
            mic.gain = 100;
            mic.setSilenceLevel(0, 0);
            mic.setUseEchoSuppression(true);
            mic.setLoopBack(true);
            mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleData);
            mic.addEventListener(ActivityEvent.ACTIVITY, onStart);
        }
        
        private function onStart(e:ActivityEvent):void
        {
            // 時間を測る
            tf=addChild(new TextField)as TextField;
            tf.autoSize=TextFieldAutoSize.LEFT;
            tf.scaleX=tf.scaleY=2;
            tf.x=tf.y=10;
            startTIme=(new Date).getTime();
            addEventListener(Event.ENTER_FRAME, onFrame);
        }
        
        private function micSampleData(e:SampleDataEvent):void
        {
            micBytes.writeBytes(e.data);
        }
        
        private function onFrame(e:Event):void
        {
            var now:Number=(new Date).getTime();
            var diff:int=(now - startTIme) * 0.001;
            tf.text=record.toString()+"秒、録音を行います。\n" + createTimeText(diff);
            
            if (diff >= record)
            {
                removeEventListener(Event.ENTER_FRAME, onFrame);
                mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, micSampleData);
                mic.setLoopBack(false);
                
                // wav用に変換
                var wave:ByteArray=new ByteArray;
                wave.endian = Endian.LITTLE_ENDIAN;
                var len:int=micBytes.length * 0.25;
                micBytes.position=0;
                for(var i:int=0; i < len; i++)
                {
                    var data:int=micBytes.readFloat() * 32767;
                    wave.writeShort(data);
                    wave.writeShort(data);
                }
                
                //wav用ByteArrayの作成
                wavBytes=new ByteArray;
                wavBytes.endian=Endian.LITTLE_ENDIAN;
                wave.position=0;
                len=wave.length;
                
                wavBytes.writeUTFBytes("RIFF");
                wavBytes.writeInt(len + 36);
                wavBytes.writeUTFBytes("WAVE");
                wavBytes.writeUTFBytes("fmt ");
                wavBytes.writeInt(16);
                wavBytes.writeShort(1);
                wavBytes.writeShort(2);
                wavBytes.writeInt(44100);
                wavBytes.writeInt(176400);
                wavBytes.writeShort(4);
                wavBytes.writeShort(16);
                wavBytes.writeUTFBytes("data");
                wavBytes.writeInt(len);
                wavBytes.writeBytes(wave);
                
                tf.text="wavファイルを保存します。\n画面をクリックしてください。"
                stage.addEventListener(MouseEvent.CLICK, onClick);
            }
        }
        
        
        // wavファイルをセーブするイベント
        private function onClick(e:MouseEvent):void
        {
            stage.removeEventListener(MouseEvent.CLICK, onClick);
            var fr:FileReference=new FileReference();
            fr.addEventListener(Event.COMPLETE, onComplete);
            fr.save(wavBytes, "data.wav");
        }
        
        // ダウンロード終了時に表示
        private function onComplete(e:Event):void
        {
            tf.text = "ダウンロードが終了しました。";
        }
        
        // 秒数を時間表示用 mm:ss に整形する関数
        private function createTimeText(time:int):String
        {
            var m:int=(time / 60) >> 0;
            var s:int=(time % 60) >> 0;
            var str:String=((m < 10) ? ("0" + m.toString()) : (m.toString()));
            str+=":" + ((s < 10) ? ("0" + s.toString()) : (s.toString()));
            
            return str;
        }
    }
}