camera test

by tepe forked from タイムラプス撮影(テスト中) (diff: 1)
♥0 | Line 165 | Modified 2012-11-02 17:57:40 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/eR61
 */

// forked from tepe's タイムラプス撮影(テスト中)
package{
    import flash.utils.ByteArray;
    import flash.text.TextField;
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.media.*;
    import flash.net.*;
    import flash.system.LoaderContext;
    import flash.system.Security;
    import frocessing.color.ColorHSV;
    import com.bit101.components.HUISlider;
    import com.bit101.components.Panel;
    import com.bit101.components.PushButton;
    
    public class Main extends Sprite
    {
        private var camera:Camera;
        private var video:Video;
        private var bd:BitmapData;

        private const WIDTH:int = 232;
        private const HEIGHT:int = 232;
        
        private var bitmapA:Bitmap;
        private var bitmapB:Bitmap;
        
        private var slider:HUISlider;
        private var slider2:HUISlider;
        
        private var btn:PushButton;
        private var btn2:PushButton;
        private var panel:Panel;
        private var tf:TextField = new TextField();
        private var s:Sprite = new Sprite();//選択カラー表示
        private var pixelCol:uint; //取得カラー
        
        private var file:FileReference = new FileReference();
 
        public function Main(){
            panel = new Panel(this);
            panel.width = panel.height = 465;
     
            btn = new PushButton(this,0,10,"WebCam ON");
            btn.x = 150;
            btn.y = 270;
            btn.addEventListener(MouseEvent.MOUSE_UP, startCamera);
            
            btn2 = new PushButton(this,0,10,"start");
            btn2.x = 250;
            btn2.y = 270;
            btn2.addEventListener(MouseEvent.MOUSE_UP, st);
            
            
            initHandler(null);
        }
        
        private var sw1:Boolean = false;
        private function st(e:MouseEvent):void{
            if(sw1==false){ 
                sw1=true;
                btn2.label="stop"
            }
            else{
                sw1=false;
                btn2.label="start";
            }
        }

        


        //セーブ
        public function save(e:MouseEvent):void {
            var fileRef:FileReference = new FileReference();
            fileRef.save(list, "test.avi");
        }



        
        private function startCamera(e:MouseEvent):void{
            camera = Camera.getCamera();
            if ( camera == null ) {
            } else {
                start();
            }
            
        }

        
        private function start():void {
            camera.setMode(WIDTH,HEIGHT, 60);//カメラ設定 width, height, frame
            video = new Video(WIDTH,HEIGHT);//ビデオサイズ width, height
            video.attachCamera(camera);
            bd = new BitmapData(video.width, video.height);//ビデオサイズのビットマップデータ
            //this.addChild( video );
            this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        //毎フレーム処理
        private var cnt:uint=0;
        private var cnt2:uint=0;
        private function onEnterFrame(e:Event):void {
            bd.lock();
            bd.draw(video);//ビデオデータ取得

            bd.unlock();
            if(cnt2==0)rec();
            cnt2++;
            cnt2%=slider2.value;
            
            bitmapB.bitmapData = list[cnt];
            cnt = slider.value;
            if(sw1==true)cnt++;
            if(cnt>=list.length)cnt=0;
            //cnt%=list.length;
            slider.value = cnt;

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

 
            bd = new BitmapData(WIDTH, HEIGHT);
            //bd.draw(loader, matrix);
            
            bitmapA = new Bitmap(bd);
            panel.content.addChild(bitmapA);
            var destbd:BitmapData = bd.clone();
            bitmapB = new Bitmap(destbd);
            bitmapB.x = WIDTH ;
            panel.content.addChild(bitmapB);
            panel.content.addChild(tf);
            tf.text = "";
            tf.wordWrap = true;
            tf.multiline =true;
            
            //aviフォーマット
            var dat:ByteArray = new ByteArray(); 
            dat.endian = "littleEndian"
            dat.writeUTFBytes("RIFF");
            dat.writeUnsignedInt(10);//ファイルサイズ
            dat.writeUTFBytes("AVI ");
            dat.writeUTFBytes("LIST");
            dat.writeUnsignedInt(10);//リストサイズ
            dat.writeUTFBytes("hdri");
            
            dat.writeUTFBytes("avih");//FOURCC コードを指定する。値は avih でなければならない。
            dat.writeUnsignedInt(4*14);//構造体のサイズを指定する。最初の 8 バイト分を差し引いた値を指定する。
            dat.writeUnsignedInt(66609);//フレーム間の間隔をマイクロ秒単位で指定する。
            dat.writeUnsignedInt(0);//ファイルの概算最大データ レートを指定する。
            dat.writeUnsignedInt(0);//データのアライメントをバイト単位で指定する。
            dat.writeUnsignedInt(0x0710);//フラグの 0 個以上のビットごとの組み合わせ
            dat.writeUnsignedInt(900);//ファイル内のデータのフレームの総数を指定する。
            dat.writeUnsignedInt(0);//インターリーブされたファイルの開始フレームを指定する。
            dat.writeUnsignedInt(0);//ファイル内のストリーム数を指定する。
            dat.writeUnsignedInt(698446);//ファイルを読み取るためのバッファ サイズを指定する。
            dat.writeUnsignedInt(WIDTH);//AVI ファイルの幅を指定する (ピクセル単位)。
            dat.writeUnsignedInt(HEIGHT);//AVI ファイルの高さを指定する (ピクセル単位)。
            //予約済み。この配列はゼロに設定する。
            dat.writeUnsignedInt(0);//dwReserved1
            dat.writeUnsignedInt(0);//dwReserved2
            dat.writeUnsignedInt(0);//dwReserved3
            dat.writeUnsignedInt(0);//dwReserved4
            
            dat.writeUTFBytes("LIST");
            dat.writeUnsignedInt(10);//リストサイズ
            dat.writeUTFBytes("strl");
            
            dat.writeUTFBytes("strh");//FOURCC コードを指定する。値は 'strh' でなければならない。
            dat.writeUnsignedInt(4*13);//構造体のサイズを指定する。最初の 8 バイト分を差し引いた値を指定する。
            dat.writeUTFBytes("vids");//ストリームに含まれるデータのタイプを指定する FOURCC
            dat.writeUTFBytes("iv32");//特定のデータ ハンドラを示す FOURCC (オプション)
            
            //データ ストリームに対するフラグ
            //ストリーム タイプの優先順位を指定する
            //    WORD   wLanguage;
            //オーディオがビデオからどのくらいスキューされているか
            //dwRate と共に使って、このストリームが使うタイム スケールを指定する
            //dwRate を dwScale で割ることにより、フレームレートが求まる
            //このストリームの開始タイムを指定する
            //このストリームの長さを指定する
            //このストリームを読み取るために必要なバッファの大きさを指定する
            //ストリーム内のデータの品質を0 ~ 10,000 の範囲の値で示す
            //データの 1 サンプルのサイズを指定する
            
  /*          
  FOURCC fcc; //FOURCC コードを指定する。値は 'strh' でなければならない。
  DWORD  cb; //構造体のサイズを指定する。最初の 8 バイト分を差し引いた値を指定する。
  FOURCC fccType; //ストリームに含まれるデータのタイプを指定する FOURCC
  FOURCC fccHandler; //特定のデータ ハンドラを示す FOURCC (オプション)
  DWORD  dwFlags; //データ ストリームに対するフラグ
  WORD   wPriority; //ストリーム タイプの優先順位を指定する
  WORD   wLanguage;
  DWORD  dwInitialFrames; //オーディオがビデオからどのくらいスキューされているか
  DWORD  dwScale; //dwRate と共に使って、このストリームが使うタイム スケールを指定する
  DWORD  dwRate; //dwRate を dwScale で割ることにより、フレームレートが求まる
  DWORD  dwStart; //このストリームの開始タイムを指定する
  DWORD  dwLength; //このストリームの長さを指定する
  DWORD  dwSuggestedBufferSize; //このストリームを読み取るために必要なバッファの大きさを指定する
  DWORD  dwQuality; //ストリーム内のデータの品質を0 ~ 10,000 の範囲の値で示す
  DWORD  dwSampleSize; //データの 1 サンプルのサイズを指定する
  */          
            for(var i:int=0;i<dat.length;i++){
                tf.appendText( dat[i].toString(16)+" " );
                if(i%4 == 3)tf.appendText("\n");
            }
            tf.height = tf.textHeight+20;
            
            slider = new HUISlider(this, 285, 250, "frame");
            slider.value = 0;
            slider.minimum = 0;
            slider.maximum = 4000;
            
            slider2 = new HUISlider(this, 55, 250, "speed");
            slider2.value = 1;
            slider2.minimum = 1;
            slider2.maximum = 1000;
            
        }
        
        private var list:Array = new Array();
        private var fpcnt:uint=0;
        private var frameSize:uint = 900;
        private function rec():void{
            var bmp:BitmapData = new BitmapData(WIDTH,HEIGHT);
            bmp.lock();
            bmp.draw(video);
            bmp.unlock();
            list.push(bmp);
            
            bitmapA.bitmapData = list[list.length-1]; 
            slider.maximum = list.length-1;
            if(frameSize<=list.length){
                list.splice(fpcnt,1);
                fpcnt%=frameSize-1;
                fpcnt++;
                /*for(var i:int=1;i<frameSize/2;i++){
                    list.splice(i,1);
                }*/
            }
            //if(sw1==false)slider.value=list.length-1;
            
        }
 
        
        
    }
}