如何在AS2中动态创建Video对象并将其添加到MovieClip?
我需要在ActionScript 2中动态创建一个Video对象,并将其添加到影片剪辑中。在AS3中,我只是这样做:
var videoViewComp:UIComponent; // created elsewhere videoView = new Video(); videoView.width = 400; videoView.height = 400; this.videoViewComp.addChild(videoView);
不幸的是,我不知道如何在AS2中完成此任务。视频不是MovieClip的子级,因此attachMovie()似乎并没有给我带来任何好处。我也看不到任何等效于AS3的UIComponent.addChild()方法。
有什么方法可以在舞台上实际显示的AS2中动态创建Video对象?
我一次可能需要多个视频。是否可以复制该视频对象?
我想我还有另一种解决方案。这不是最佳选择,但它与我为其他组件要做的一些事情很适合,因此在项目中也不太合适。一旦弄明白了,我将在这里发布我所做的事情。
解决方案
回答
我建议我们创建一个Video对象的实例,使其不可见(即," videoview.visible = false"),并在需要时加载剪辑,并在适当的时间显示它。如果有必要,我们也可以使用swapDepth()
。
AS2中的视频处理从来都不是最好的事情。请放心,我们会遇到很多小问题(无间隙的循环等)。
回答
好的,我有一些工作要做。
首先,我创建了一个新的Library符号,并将其命名为" VideoWrapper"。然后,我向其中添加了一个ID为" video"的Video对象。
现在,任何时候我需要将视频动态添加到状态时,都可以使用MovieClip.attachMovie()添加Video对象的新副本。
为了使事情变得更容易,我编写了一个VideoWrapper类,该类公开了基本的UI元素处理(setPosition(),setSize()等)。因此,当以常规的UI布局代码处理Video时,我只是使用这些方法,使其看起来与我所有其他UI元素一样。处理视频时,我只访问该类的"视频"成员。
我的实际实现有点复杂,但这就是我如何使事情工作的基础。我有一个测试应用程序,它正在播放2个视频,一个来自本地摄像机,一个来自FMS流,并且运行良好。
回答
方法是我通常要做的,因为其他选择是将UIcomponent mediaDisplay包含到库中,然后使用attachMovie添加该组件,但是我发现mediaDisplay有点小问题,所以我更喜欢使用原始视频实例。
回答
我希望下面的代码对我们非常有用:
import UTIL.MEDIA.MEDIAInstances class Main { static function main() { var MEDIAInstancesInstance :MEDIAInstances = new MEDIAInstances (); _root.Video_Display.play ("IsothermalCompression.flv", 0); _root.VideoDisplayMC.onPress = function() { _root.Video_Display.seek (0); } // _root.displayMC.onPress = function() { } // static function main() } // class Main // import UTIL.MEDIA.VideoDisplay class UTIL.MEDIA.MEDIAInstances { function MEDIAInstances() { // depth _root.createEmptyMovieClip ("VideoDisplayMC", 500); // var Video_Display:VideoDisplay = new VideoDisplay(_root.VideoDisplayMC, "Video_Display", 1); Video_Display.setLocation(400, 0); Video_Display.setSize (320, 240); // _root.Video_Display = Video_Display; _root.VideoDisplayMC._alpha = 75; } // MEDIAInstances() } // class UTIL.MEDIA.MEDIAInstances // class UTIL.MEDIA.VideoDisplay { private var display:MovieClip, nc:NetConnection, ns:NetStream; function VideoDisplay(parent:MovieClip, name:String, depth:Number) { display = parent.attachMovie("VideoDisplay", name, depth); nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc); display.video.attachVideo(ns); } function setSize(width:Number, heigth:Number):Void { display.video._width = width; display.video._height = heigth;} function setLocation(x:Number, y:Number):Void { display._x = x; display._y = y;} public function play(url:String, bufferTime:Number):Void { if (bufferTime != undefined) ns.setBufferTime(bufferTime); ns.play(url); } // public function pause():Void { ns.pause();} // public function seek(offset:Number):Void { ns.seek(offset); } } // UTIL.MEDIA.VideoDisplay
回答
为了向我们发送标记行的结尾,我使用了w3schools的HTML符号实体
摘自一个项目的示例如下:
< asset path="library\video.swf" />
上面的行显示了一个名为library的目录,其中包含文件video.swf。
此外,目录库中还有文件video.xml。该文件包含以下行
<xml version="1.0" encoding="utf-8" > <movie version="7"> <frame> <library> <clip id="VideoDisplay"> <frame> <video id="VideoSurface" width="160" height="120" /> <place id="VideoSurface" name="video" /> </frame> </clip> </library> </frame> </movie>
很久以前,我的儿子Alex从Internet下载了VideoDisplay类的代码和目录库
我已经改进了VideoDisplay类的代码。
通过写2名成员
public function pos():Number { return ns.time; } public function close():Void { return ns.close(); }
我创建的程序
是
不仅仅是.flv文件的浏览器和演示者
它也是
是每个.flv
文件的选定片段的浏览器和演示者
现在,VideoDisplay类的代码为:
class util.VideoDisplay { //{ PUBLIC MEMBERS /** * Create a new video display surface */ function VideoDisplay(targetURI:String, parent:MovieClip, name:String, depth:Number, initObj) { display = parent.attachMovie("VideoDisplay", name, depth, initObj); // create video stream nc = new NetConnection(); nc.connect(targetURI); ns = new NetStream(nc); // attach the video stream to the video object display.video.attachVideo(ns); } /** * Video surface dimensions */ function setSize(width:Number, heigth:Number):Void { display.video._width = width; display.video._height = heigth; } /** * Video clip position */ function setLocation(x:Number, y:Number):Void { display._x = x; display._y = y; } /** * Start streaming * @param url FLV file * @param bufferTime Buffer size (optional) */ public function play(url:String, bufferTime:Number):Void { if (bufferTime != undefined) ns.setBufferTime(bufferTime); ns.play(url); } /** * Pause streaming */ public function pause():Void { ns.pause(); } /** * Seek position in video */ public function seek(offset:Number):Void { ns.seek(offset); } /** * Get position in video */ public function pos():Number { return ns.time; } public function close():Void { return ns.close(); } //} //{ PRIVATE MEMBERS private var display:MovieClip; private var nc:NetConnection; private var ns:NetStream; //} }