camera test
forked from タイムラプス撮影(テスト中) (diff: 1)
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;
}
}
}