1

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

非常感谢!

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

4

4 回答 4

1

如果有 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,然后播放。大部分跳跃来自于将剪辑加载到舞台,因此预渲染剪辑可能会有所帮助。

于 2009-11-04T02:13:36.117 回答
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 循环并切换每个帧的可见属性。可能会使用内存分配,我不知道它在速度方面是否可行。

于 2009-11-06T10:09:48.867 回答
0

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

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

于 2010-10-24T03:19:08.660 回答
-1

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

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

于 2009-11-04T01:52:12.760 回答