2009-11-03 135 views
1

我将多个影片存储为影片剪辑对象,并希望将它们合并到单个影片剪辑视频对象中,以便按顺序播放所有视频(以便用户认为它是单个视频)。将多个影片剪辑合并成一个单独的影片剪辑

非常感谢!

编辑:我想以编程方式在ActionScript中的Flash播放器。

回答

-1

将它们添加到时间轴中,确保每个动画片段存在于时间线上,只要它包含的动画的持续时间是。您可以通过将关键帧添加到将包含影片剪辑的时间轴中来实现。另外,请确保您的视频帧率和Flash播放器帧率相同。

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

+0

我刚刚澄清说我需要在ActionScript中使用Flash Player,所以它是一个编程问题。 – bartekb

1

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

您可以使用addFrameScript()将代码添加到您的动画片段(或任何其他帧)的最后一帧。此代码可以删除旧的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帧听起来不错,但你必须尝试)可见设置为假,并停止。然后,当前剪辑的最后一帧滚动时,只需删除当前剪辑,并将新剪辑可见属性设置为true,然后播放它。大部分跳转来自将剪辑加载到舞台上,因此预渲染剪辑可能会有所帮助。

+0

谢谢。不幸的是,这并没有解决我的问题。我使用MovieClip的ENTER_FRAME事件做了类似的事情。当触发ENTER_FRAME事件时,我将currentFrame与totalFrames进行比较,如果它们相等,则我开始播放后续的MovieClip。不过,我在MovieClips的拼接点处得到明显的延迟。我认为我可以摆脱延迟,如果有可能将影片剪辑合并为一个。可能吗? – bartekb

+0

你是非常正确的。这是一个常见问题。我已经添加了对我的答案的编辑,可能有所帮助。 –

+0

谢谢。我尝试了预加载所有内容,但仍然在我切换MovieClips时调用play()或gotoAndPlay()时,即使在相当快的机器上,延迟也是显而易见的。似乎没有办法绕过它。 – bartekb

0

不是一个真正的答案,而是两件你可以试试的东西。

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循环并切换每个帧的可见属性。 可能会使用分配的内存,我不知道它是否是远程可行的速度明智的。

0

如果我是你,我会赖特一个简单的包装它会只是: *知道文件的顺序从一些XML配置 显示*,而玩的第一个文件的措施FPS(或可用RAM或互联网连接 - 取决于你如何将文件传送到电脑上播放vedia) *最后,封装程序决定它只是将第二个文件加载到某个可播放百分比的预计时间的200%-300%。 *如果您的预测算法足够酷 - 在第一次停止之前您有第二个vid。所以这里是最简单的部分imho [如果你的最后一帧和第一帧匹配得足够好]:你只需暂停你需要的帧上的第二个vid,并将它的'alpha设置为0,将它置于第一个之下。当第一个来到匹配框架,你开始减少它的alpha增加第二个',而不是从暂停释放它。

唯一的人工任务(除了编码包装,但它感觉就像一对代码最大的屏幕)正在寻找匹配的帧并把它全部配置,但你可以通过使用BitmapData.compare()方法。祝你好运!