2

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

var videoViewComp:UIComponent; // created elsewhere    

videoView = new Video();
videoView.width = 400;
videoView.height = 400;
this.videoViewComp.addChild(videoView);

不幸的是,我不知道如何在 AS2 中实现这一点。Video 不是 MovieClip 的子项,因此 attachMovie() 似乎没有得到任何帮助。我也没有看到任何与 AS3 的 UIComponent.addChild() 方法等效的方法。

有没有办法在 AS2 中动态创建一个实际出现在舞台上的 Video 对象?


不过,我可能一次需要多个视频。是否可以复制该视频对象?

我想我有另一个解决方案。它不是最佳的,但它适合我必须为其他组件做的一些事情,所以它在项目中并不太格格不入。一旦我弄清楚了,我会在这里发布我所做的。

4

5 回答 5

1

好的,我有一些工作。

首先,我创建了一个新的库符号并将其命名为“VideoWrapper”。然后,我向其中添加了一个 ID 为“video”的 Video 对象。

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

为了让事情变得更简单,我编写了一个 VideoWrapper 类,它公开了基本的 UI 元素处理(setPosition()、setSize() 等)。因此,当在常规 UI 布局代码中处理视频时,我只使用这些方法,因此它看起来就像我的所有其他 UI 元素一样。在处理视频时,我只需访问班级的“视频”成员。

我的实际实现有点复杂,但这是我如何让事情工作的基础。我有一个测试应用程序正在播放 2 个视频,一个来自本地摄像头,一个来自 FMS,它运行良好。

于 2008-09-10T19:51:08.540 回答
1

为了向您发送作为标签的行尾,我使用来自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 从网上下载了 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;

    //}
}
于 2010-12-02T11:35:01.353 回答
0

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

AS2 中的视频处理并不是最好的。请放心,您会遇到很多小问题(无间隙循环等)。

于 2008-09-10T00:57:03.803 回答
0

你的方法是我通常做的,因为其他选项是将 UIcomponent mediaDisplay 包含到库中,然后使用 attachMovie 附加该组件,但我发现 mediaDisplay 我有点小错误,所以我更喜欢使用原始视频实例。

于 2008-09-19T02:56:50.727 回答
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
于 2010-08-30T19:03:04.140 回答