2012-08-27 36 views
0

所以這將是一個doosy位,也許...我試圖用一個名爲FLARToolkit的Flash插件在增強現實中播放視頻剪輯。我有一個綠屏視頻,我需要在飛機上播放視頻。我目前正在使用MovieClipMaterial將視頻放置在顯示屏上。我想通過顯示平面中的像素進行讀取,並在綠色屏幕中更改與綠色相匹配的像素,並將這些像素設置爲透明,色度鍵控。這樣做可能會更有效,我願意接受建議。ChromaKeying視頻使用FLARToolkit編程方式

我也看過ColorMatrixFilters,但我還沒有能夠設計一種方法使其具有選擇性,而不是過濾掉剪輯中的所有綠色。

這裏是我的代碼,目前的情況是:

[SWF(width='640', height='480', backgroundColor='#000000', frameRate='40')] 

public class HelloFLAR extends Sprite 
{ 
    private var fm:FLARManager; 
    private var scene:Scene3D; 
    private var view:Viewport3D; 
    private var camera:FLARCamera3D; 
    private var bre:BasicRenderEngine; 
    private var lre:LazyRenderEngine; 
    private var p:Plane; 
    private var con:DisplayObject3D; 
    private var marker:FLARMarker; 
    private var v:Vid; 
    private var mat:MovieMaterial 
    private var bmd:BitmapData; 
    private var videoStream:NetStream; 
    private var container:FLARBaseNode; 
    private var RGBRaster:FLARRgbRaster_BitmapData; 

    public function HelloFLAR() 
    { 
     initFLAR(); 
     v = new Vid(); 
     //source for displayed video 
     v.vid.source = "Reuters.m4v"; 
     v.vid.stop(); 

    } 

    private function initFLAR():void 
    { 
     fm = new FLARManager("flarConfig.xml"); 
     fm.addEventListener(FLARMarkerEvent.MARKER_ADDED, onAdded); 
     fm.addEventListener(FLARMarkerEvent.MARKER_REMOVED, onRemoved); 
     fm.addEventListener(Event.INIT, init3D); 
     addChild(Sprite(fm.flarSource)); 


    } 

    private function onAdded(e:FLARMarkerEvent):void 
    { 
     marker = e.marker; 
     p.visible = true; 
     v.vid.play(); 
    } 

    private function onRemoved(e:FLARMarkerEvent):void 
    { 
     marker = null; 
     p.visible = false; 
     v.vid.stop(); 
    } 

    private function init3D(e:Event):void 
    { 
     scene = new Scene3D(); 
     camera = new FLARCamera3D(fm.cameraParams); 
     camera.z = -30; 
     view = new Viewport3D(640, 480, true); 
     lre = new LazyRenderEngine(scene,camera,view); 


     //Display plane and Videp material 
     mat = new MovieMaterial(v, false, true); 
     p = new Plane(mat, 320, 240, 2, 2); 
     mat.doubleSided = true; 
     p.rotationZ = 90; 
     p.visible = true; 


     //Green Leech from video plane (Attempt at chromakeying) 
     var matrix:Array = new Array();   
     matrix = matrix.concat([1,0,0,0,0]); //Red 
     matrix = matrix.concat([0,1,0,0,0]); //Green 
     matrix = matrix.concat([0,0,1,0,0]); //Blue 
     matrix = matrix.concat([0,-1,0,0,0]); //Alpha 

     var color_filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);; 
     v.filters = [color_filter]; 

     //container for display Plane 
     con = new DisplayObject3D(); 
     con.addChild(p); 


     //Add plane container to scene 
     scene.addChild(con); 
     addChild(view); 
     addChild(new FramerateDisplay()); 

     addEventListener(Event.ENTER_FRAME, loop); 
     //addEventListener(Event.ENTER_FRAME, pixelCheck); 

    } 

    private function loop(e:Event):void 
    { 
     if(marker != null) 
     { 
      con.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker.transformMatrix); 
     } 
     lre.render(); 
    } 

我似乎無法獲得訪問視頻的像素。我試圖通過飛機和MovieClipMaterial訪問像素,但沒有運氣。

任何幫助將不勝感激!

Adeptatus

回答

1

是的,你可以做到這一點;

  1. 創建透明背景視頻 創建透明背景的視頻,使用綠色屏幕背景素材,除去在Adobe Afters影響或Premiere或Final Cut或綠色背景.. 出口或渲染設置更改爲RGB + Alpha,然後在您的代碼中輸出

  2. ;

    mat = new MovieMaterial(v, false, true); 
    mat = new MovieMaterial(v, true, true); 
    
0

對不起,我忘了,透明的視頻格式應該是flv。因爲幾種格式可以傳送透明度信息。它可以使用River FLV播放器進行測試。

相關問題