所以这可能会有点傻,也许...我正在尝试使用名为FLARToolkit的闪存插件在增强现实中播放视频剪辑。我有一个绿屏视频,我需要在飞机上播放这个视频。我目前正在使用MovieClipMaterial将视频放置在显示平面上。我想要遍历显示平面中的像素,并更改与绿色屏幕中的绿色匹配的像素,并将这些像素设置为透明、色度键控。也许有一种更有效的方法来做到这一点,我对建议持开放态度。
我也研究过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
发布于 2012-10-04 21:11:18
是的,你可以这样做;
mat =新MovieMaterial(v,false,true);mat =新MovieMaterial(v,true,true);
发布于 2012-10-05 20:29:25
对不起,我忘了,透明的视频格式应该是flv。因为一些格式可以携带透明信息。可以使用River FLV player进行测试。
https://stackoverflow.com/questions/12147827
复制相似问题