右下の「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を同じディレクトリに入れてやる必要あり)
import fl.events.*;
// 入力用
var video:Video = new Video(320,240);
var conn:NetConnection = new NetConnection();
conn.connect(null);
var stream:NetStream = new NetStream(conn);
stream.client = { onMetaData:function():void {} };var bmd:BitmapData = new BitmapData(320,240);
// ミラー
var mirror:BitmapMirror = new BitmapMirror(bmd);
var bmp_result:Bitmap = new Bitmap(mirror.getBitmapData());// 結果表示用
bmp_result.x = 0;
bmp_result.width = 640;
bmp_result.height = 240;
this.addChild(bmp_result);var playFlug:Boolean = false;
buttonLoad.addEventListener(MouseEvent.CLICK, loadVideo);
function loadVideo(e:Event){
trace(”loadVideo()”);
stream.play(textUrl.text);
playFlug = true;
}this.addEventListener(Event.ENTER_FRAME, reloadMirror);
slider.addEventListener(SliderEvent.THUMB_DRAG, reloadMirror);function reloadMirror(e:Event){
if(!playFlug) return;
video.attachNetStream(null);
bmd.draw(video); // ビットマップデータを取得
video.attachNetStream(stream);
mirror.threshold = slider.value;
mirror.process(); // 鏡写しのビットマップデータ作成
}