0

假设我有一个包含 180 帧全高清的 .flv。

我将它导入到 Flash(或 flex)中,并希望能够通过单击并拖动视图来平滑地浏览时间线。

我该怎么做?

我目前的解决方案是将每一帧加载到一个 BitmapData 数组中,它可以工作,但它使用 1.5 GB 内存,这可能会导致我的一些问题。

我只需要一种能够单击并向左/向右拖动以平滑地向前/向后滚动帧的方法。

在我的简单测试中,它真的很滞后。

这是我的简单测试代码,它太慢了:

import flash.events.Event;
import flash.events.MouseEvent;

stop();

var mouseDownValue:Boolean = false;
var currentFrameValue:int = 0;
var maxFramesValue:int = 180;
var oldMouseX:int;


myMovie.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
myMovie.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
myMovie.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);


function mouseDownHandler(evt:MouseEvent):void{
    mouseDownValue = true;
}

function mouseUpHandler(evt:MouseEvent):void{
    mouseDownValue = false;
}

function mouseMoveHandler(evt:MouseEvent):void{
    if(mouseDownValue){
        if(oldMouseX<0) oldMouseX = mouseX;
        currentFrameValue += (oldMouseX - mouseX)/2;
        if(currentFrameValue>=(maxFramesValue-2)) currentFrameValue -= (maxFramesValue-1);
        if(currentFrameValue<0) currentFrameValue += (maxFramesValue-1);

        myMovie.gotoAndStop(currentFrameValue+1);

        oldMouseX = mouseX;
    }
}
4

3 回答 3

1

我认为您应该重新压缩您的视频文件,每帧添加一个关键帧(关键帧距离 = 1) - 在 Adob​​e Media Encoder 中有一个选项可以设置所述距离。

生成的文件将比现在大,但应该小于 180 位图。

嵌入时间线时,请确保不要更改关键帧距离。

Flash 只能“跳转”到一个叫做“关键帧”的帧,如果视频在时间轴上,它可以跳转到任何帧,但它必须先读取关键帧,然后进行一些繁重的计算,所以它是滞后的。

于 2013-05-08T11:52:27.110 回答
0

是的......流式传输数据,如果它在本地运行,因为我认为它确实给定大小,不应该是一个问题,加载最接近当前帧的帧并摆脱其他帧......另外,您确定需要全高清视频吗?有时您可以将其拉伸而几乎感觉不到质量下降...另外,不要使用位图数据数组,那太大了,请确保已将其压缩...

于 2013-05-23T17:58:27.140 回答
0

可能您必须将图片与 SWF 分开存储,在需要时按一张加载?我的意思是,您可以使用 URLLoader 类来加载您的位图,将 loader.data 保存到位图类型的对象中,然后显示它。当然,您每次都必须删除以前的图片,您正在加载一张新图片。

于 2013-05-08T11:51:58.830 回答