2008-09-09 47 views
2

我需要在ActionScript 2中动态创建Video对象并将其添加到影片剪辑。在AS3我只是这样做:如何在AS2中动态创建Video对象并将其添加到MovieClip?

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对象?


虽然我一次可能需要多个视频。是否有可能复制该视频对象?

我想我有另一个解决方案的工作。这不是最佳的,但它符合我为其他组件所做的一些事情,所以它在项目中并不太合适。一旦我明白了,我会发布我在这里做的。

回答

2

好吧,我有一些工作。

首先,我创建了一个新的库符号,并将其称为“VideoWrapper”。然后我将一个Video对象添加到ID为“video”的视频对象。

现在,无论何时我需要动态地将视频添加到我的状态,我都可以使用MovieClip.attachMovie()添加视频对象的新副本。

为了使事情更容易,我写了一个VideoWrapper类,它公开基本的UI元素处理(setPosition(),setSize()等)。因此,在处理常规用户界面布局代码中的视频时,我只是使用这些方法,使其看起来与我所有其他用户界面元素一样。在处理视频时,我只需访问该课程的“视频”成员。

我的实际执行情况有点复杂,但这是我工作的基础知识。我有一个测试应用程序正在播放2个视频,一个来自本地摄像头,另一个来自FMS的流媒体,它的运行效果很好。

0

我建议您创建Video对象的单个实例,使其不可见(即videoview.visible = false),并在需要时加载剪辑,并在适当的时间显示它。如果有必要,您也可以使用swapDepth()

在AS2中的视频处理不是有史以来最好的事情。放心吧,你会遇到很多小问题(循环没有间隙等)。

0

您的方法是我通常做的,因为其他选项是将UIcomponent mediaDisplay包括到库中,然后使用attachMovie附加该组件,但是我发现mediaDisplay是一个小bug,所以我更愿意使用原始视频实例。

0

我希望下面的代码将是对你非常有用:

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 
+1

因此,这段代码 - 除非我误解了,否则将视频放到舞台上,并将名为“VideoDisplay”的现有movieclip(从哪里?或者我在这里错过了什么?有没有办法完全动态地做到这一点,还是一切都回来拖动到舞台上的东西? – 2010-11-09 14:03:57

1

要送你一条线是一个标签的两端,我使用的HTML符号实体从w3schools

一个例子从项目采取将如下所示:

< asset path="library\video.swf" /> 

上面的线显示有其中包含文件的目录名为库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下载的VideoDisplay类的代码,并从互联网

我已经iproved类的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; 

    //} 
} 
相关问题