【问题标题】:How do I dynamically create a Video object in AS2 and add it to a MovieClip?如何在 AS2 中动态创建 Video 对象并将其添加到 MovieClip?
【发布时间】:2010-09-08 08:09:01
【问题描述】:

我需要在 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 对象?


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

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

【问题讨论】:

    标签: flash video actionscript-2


    【解决方案1】:

    好的,我有一些工作。

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

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

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

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

    【讨论】:

      【解决方案2】:

      为了向您发送作为标签的行尾,我使用来自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;
      
          //}
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            希望下面的代码对你很有用:

            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
            

            【讨论】:

            • 所以这段代码 - 除非我弄错了,否则会附加一个名为“VideoDisplay”的现有影片剪辑(从哪里来?),并将视频放到它的舞台上?或者我在这里错过了什么?有没有办法完全动态地做到这一点,还是回到把东西拖到舞台上?
            猜你喜欢
            • 2020-01-13
            • 1970-01-01
            • 1970-01-01
            • 2012-09-26
            • 1970-01-01
            • 2019-12-26
            • 1970-01-01
            • 1970-01-01
            • 2016-01-11
            相关资源
            最近更新 更多