右下の「Load」を押して再生。

Source Code (Flash CS3 / AS3)

土善開発合宿(ゆーすけべー日記: 奥出研’07秋合宿@土善旅館に部外者(OB)の開発合宿も兼ねて参入してきた)で作ってたBitmapMirror.asを公開しておきます。

宴会直前に到着したのであんまり時間がなかったけど、今回やったことは3つ

1.YouTubeのビデオ(flv)をGoogleVideo経由で取得して

2.AS3のBitmapDataとして扱って

3.鏡面反射させる

ビデオはこれを読み込んでいます。ひゃあ゛ああああうまい゛いいいいい

■1.YouTubeのビデオをGoogleVideo経由で取得する

数ヶ月前にGoogleに買収されて以来、

http://www.youtube.com/watch?v=YRY0M5cgDG8

のビデオは

http://cache.googlevideo.com/get_video?video_id=YRY0M5cgDG8

から取れる様になりました。

以前はWebService::YouTube使って

スクレイピングしなければならなかったけど、素直になった。



■2.flvからBitmapDataオブジェクトを作る

Flash Player9から、flvファイルや画像を外部から読み込んでBitmapDataオブジェクトを作るとクロスドメイン警告が出る様になった。

適切なcrossdomain.xmlが置いてあるサイトなら(例えばfarm1.static.flickr.comなど)

fl.Loader系でloadする時に

uiLoader.load(new URLRequest(textUrl.text), new LoaderContext(true,null, null));

などして、LoaderContextオブジェクトを渡してやれば

crossdomain.xmlを読んでくれるんだが

なんとかする方法を見つけた。

BitmapData.draw()メソッドでビットマップデータオブジェクトを外部のドメインのデータから作ろうとするとした時に警告が出る、ということは、

draw()する瞬間だけ外部ドメインじゃなければいい。

こうする。

video.attachNetStream(null);

bmd.draw(video);//ビットマップデータを取得

video.attachNetStream(stream);

ビットマップ取る時だけnullをattachしても、videoの表示は消えない(一瞬止

まる)だけなので目には見えない。

ここまで情報元:[Saq.] YouTube の FLV を抜き出すのが簡単になっている件

■3.BitmapMirror.asで鏡面反射させる

使い方。

コンストラクタでBitmapDataを渡してあげて、process()する。getBitmapData()で処理後のBitmapDataを取得できるので結果表示用のBitmapに渡してやれば表示できる。

thresholdプロパティで左端から鏡までの距離を指定できる。

myBitmapData:BitmapDataがカメラやストリームやMovieCilpなり何なりから作ってあるとして、

var mirror:BitmapMirror = new BitmapMirror(myBitmapData);

// 鏡処理(左右反転)したbitmapdataを受け取る

mirror.getBitmapData();

// 反転処理を反映させる

mirror.process();

普通にあらかじめ

var bmp_result:Bitmap = new Bitmap(mirror.getBitmapData());

this.addChild(bmp_result);

しておけば、毎フレーム毎に mirror.process(); すれば更新されます。

thresholdプロパティは、「左端から何ピクセル目に鏡をあてているか」です。

mirror.threshold = 30だと30ピクセル目になる。

今回はスライダーに合わせてるので、ソースが横幅320pixelだから

slider.maximum = 320;

mirror.threshold = slider.value;

mirror.process();

ってやってる。

Kagami.fla 1frame目(BitmapMirror.asを同じディレクトリに入れてやる必要あり)

importfl.events.*;

//入力用

varvideo:Video=newVideo(320,240);

varconn:NetConnection=newNetConnection();

conn.connect(null);

varstream:NetStream=newNetStream(conn);

stream.client={onMetaData:function():void{}};

varbmd:BitmapData=newBitmapData(320,240);

//ミラー

varmirror:BitmapMirror=newBitmapMirror(bmd);

varbmp_result:Bitmap=newBitmap(mirror.getBitmapData());

//結果表示用

bmp_result.x=0;

bmp_result.width=640;

bmp_result.height=240;

this.addChild(bmp_result);

varplayFlug:Boolean=false;

buttonLoad.addEventListener(MouseEvent.CLICK,loadVideo);

functionloadVideo(e:Event){

trace(“loadVideo()”);

stream.play(textUrl.text);

playFlug=true;

}

this.addEventListener(Event.ENTER_FRAME,reloadMirror);

slider.addEventListener(SliderEvent.THUMB_DRAG,reloadMirror);

functionreloadMirror(e:Event){

if(!playFlug)return;



video.attachNetStream(null);

bmd.draw(video);//ビットマップデータを取得

video.attachNetStream(stream);

mirror.threshold=slider.value;

mirror.process();//鏡写しのビットマップデータ作成

}