【问题标题】:Merge multiple MovieClips into a single MovieClip将多个 MovieClip 合并为一个 MovieClip
【发布时间】:2010-12-12 18:41:47
【问题描述】:

我将多个视频存储为 MovieClip 对象,并希望将它们合并为一个 MovieClip 视频对象,以便按顺序播放所有视频(以便用户认为这是一个视频)。

非常感谢!

编辑:我想在 Flash Player 内的 ActionScript 中以编程方式进行。

【问题讨论】:

    标签: flash actionscript-3 actionscript-2 movieclip


    【解决方案1】:

    如果我是你,我会编写一个简单的包装器: * 从一些 xml 配置中知道要显示的文件的顺序 * 在播放第一个文件时测量 fps(或可用 RAM 或互联网连接 - 取决于您如何将文件传送到播放 vedia 的电脑) * 当最后包装器决定它只是将第二个文件加载到某个可播放百分比的预计时间的 200%-300% 时。 *如果您的预测算法足够酷-您在第一个停止之前有第二个视频。所以这里是最简单的部分恕我直言[如果你的最后一帧和第一帧匹配得足够好]:你只需在你需要的帧上暂停第二个 vid,并将它的 alpha 设置为 0,将它放在第一个下面。当第一个到达匹配帧时,您开始减少它的 alpha,而是增加第二个并从暂停中释放它。

    唯一的人工任务(除了编码包装器,但感觉就像最多几个屏幕的代码)是搜索匹配的帧并将其全部用于配置,但您甚至可以通过使用 @987654321 来避免它@ 方法。祝你好运!

    【讨论】:

      【解决方案2】:

      不是一个真正的答案,但你可以尝试两件事。

      package {
          import flash.display.MovieClip;
          import flash.events.Event;
      
          public class OneMovieToRuleThemAll extends MovieClip {
      
              public subClips:Array; //vector for cs4
              private var index:int = 0;
      
              public function OneMovieToRuleThemAll(subClips:Array) {
                  this.subClips = subClips;
              }
      
              //pre subClips.length > 0
              public function playAll() {
                  for(var i:int = 0; i < subClips.length; i++) {
                      subClips[i].visible = i == 0;
                      subClips[i].stop();
                      addChild(subClips[i]);
                  }
                  addEventListener(Event.ENTER_FRAME, onEnterFrame);
              }
      
              private function onEnterFrame(e:Event) {
                  if(index >= subClips.length) {
                      //dispatchEvent finished
                      removeEventListener(Event.ENTER_FRAME, onEnterFrame);
                  }
      
                  if(subClips[index].currentFrame < subClips[index].totalFrames) {
                      subClips[index].gotoAndStop(subClips[index].currentFrame + 1);
                  }else{
                      subClips[index].visible = false;
                      index++;
                      subClips[index].visible = true;
                  }
      
              }
          }
      
      }
      

      通常不鼓励使用 enter_Frame 和 gotoAndStop(currentFrame),因为它很慢,但也许每个帧都同样慢,所以你不会注意到任何“拼接”

      另一种方法是使用 BitmapData.draw(..); 为每部电影的每一帧构建一个带有位图的新电影剪辑。然后使用相同的 enter_frame 循环并切换每个帧的可见属性。 可能会使用内存分配,我不知道它在速度方面是否可行。

      【讨论】:

        【解决方案3】:

        如果有 TIMELINE_COMPLETE 事件会很棒。但是没有!所以下一个最好的事情是未记录的 addFrameScript 方法。

        您可以使用 addFrameScript() 将代码添加到 MovieClips 的最后一帧(或任何其他帧)。此代码可以删除旧的 MovieClip(刚刚完成的),并添加新的 MovieClip(队列中的下一个)。

        public function Main() 
        {
            // Remember addFrameScript() is zero based.
            currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, frameFunction);
        }
        
        private function frameFunction():void 
        {
            //delete frame script by passing null as second parameter
            currentVidMc.addFrameScript(currentVidMc.totalFrames - 1, null);
        
            removeChild(currentVidMc);
            addChild(newVidMc);
            newVidMc.gotoAndPlay(1);
        }
        

        编辑*

        为了实现平滑过渡,您可以尝试尽早加载新剪辑(大约 15 帧对我来说听起来不错,但您必须尝试)将可见设置为 false,然后停止。然后当当前剪辑的最后一帧滚动时,只需删除当前剪辑,并将新的剪辑可见属性设置为true,然后播放。大部分跳转来自于将剪辑加载到舞台,因此预渲染剪辑可能会有所帮助。

        【讨论】:

        • 谢谢。不幸的是,这并不能解决我的问题。我使用 MovieClip 的 ENTER_FRAME 事件做了类似的事情。当 ENTER_FRAME 事件被触发时,我将 currentFrame 与 totalFrames 进行比较,如果它们相等,我开始播放后续的 MovieClip。但是,我在 MovieClips 的拼接点处得到了明显的延迟。我认为如果可以将 MovieClip 合并为一个,我就可以摆脱延迟。有可能吗?
        • 你说的很对。这是一个常见的问题。我在我的答案中添加了一个可能有帮助的编辑。
        • 谢谢。我已经尝试过预加载所有内容,但是当我在切换 MovieClips 时调用 play() 或 gotoAndPlay() 时,即使在相当快的机器上延迟也是显而易见的。似乎没有办法解决它。
        • 这对我来说也不是好消息!我有一个项目即将到来,我需要这样做。我现在有点担心。希望你能找到答案。
        • 如果我找到任何解决方案,我一定会在这里分享。如果你找到了请告诉我。
        【解决方案4】:

        将它们一个接一个地添加到时间线上,确保每个影片剪辑都存在于时间线上,只要它包含的影片的持续时间是。您可以通过将关键帧添加到将包含影片剪辑的时间线来完成此操作。另外,请确保您的视频帧速率和 Flash 播放器的帧速率相同。

        这不是一个真正的编程问题。

        【讨论】:

        • 我刚刚澄清了我需要在 Flash Player 中的 ActionScript 中完成,所以这是一个编程问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 2017-06-25
        • 2013-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多