2008-09-09 50 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; 

    //} 
} 
相關問題