将多个MovieClip合并到一个MovieClip中

时间:2009-11-03 19:24:18

标签: flash actionscript-3 actionscript-2 movieclip

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

非常感谢!

编辑:我想在Flash Player中的ActionScript中以编程方式执行此操作。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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),因为它很慢,但是对于每一帧,这可能同样慢,所以你不会注意到任何'拼接'

另一种方法也可以是使用Bitmap为每个电影的每一帧构建一个带有Bitmap的新动画片段和BitmapData.draw(..);然后使用相同的enter_frame循环并切换每个帧的可见属性。 可能使用了大量的内存,我不知道它是否在速度上是可行的。

答案 2 :(得分:0)

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

唯一的人工任务(除了编写包装器,但感觉就像几个代码最大的屏幕)正在搜索匹配的帧并将其全部配置为配置,但你甚至可以通过使用{{ 1}}方法。祝你好运!

答案 3 :(得分:-1)

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

这不是一个编程问题。