右下の「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();//鏡写しのビットマップデータ作成
}