0

我的项目有一个主加载器,用于加载项目的所有资产。我需要用它加载一些我的视频。

视频有 16mb,我想在主加载器完成后加载 3mb 使用。

我尝试使用 Netconnection/Netstream 打开一个新连接以加载 3mb 并关闭连接,但是当项目启动并播放视频时,会打开一个新连接,从头开始加载它。

我正在尝试找到一种可以使用已加载的 3mb 的方法。这样做,用户不需要等待一个主加载器和一个辅助加载器(缓冲时间)。

这是我的代码,对不起各位。

var loader:Loader = new Loader();

var nc:NetConnection = new NetConnection();
var ns:NetStream = new NetStream(nc);

var client:Object = new Object();

var swfRatio:Number;
var videoRatio:Number;

function init():void
{
    nc.connect(null);

    client.onCuePoint = cuePointHandler;
    client.onMetaData = metaDataHandler;

    ns.client = client;

    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressLoader);
    addEventListener(Event.ENTER_FRAME, progressTotal);

    loader.load(new URLRequest("swf/main.swf"));
    ns.play("f4v/main_movie.f4v");
    ns.pause();
}

function progressLoader(event:ProgressEvent):void
{               
    swfRatio = (event.bytesLoaded / event.bytesTotal);
}

function progressTotal():void
{
    //Here i get the amount that i want to preload from my video, in this case i want 3mb or 3072000 bytes
    videoRatio = (ns.bytesLoaded / 3072000);

    //This is a variable that i use to fill my loader asset and verify if my content its totaly loaded.
    var frameValue:int = ((videoRatio + swfRatio) / 2) * 100;

    if (frameValue >= 100)
    {
        removeEventListener(Event.ENTER_FRAME, progressTotal);
        // Here i close my connection, i suppose that i need to use the same connection in my player.
        ns.close();
        ns = null;
        nc.close();
        nc = null;
        loaderComplete();
    }
}

function loaderComplete():void
{
    removeChild(assetLoader);
    //Here i add my player to the stage, i want to use the preloaded video with him.
    addChild(loader.content);
}

function cuePointHandler(infoObject:Object):void {
    trace(infoObject.name);
}

function metaDataHandler(infoObject:Object):void {
    trace("metaData");
}

然后在我刚刚加载并添加到舞台的播放器中,我正在使用 OSMF 来帮助我进行控制。

为了测试“预加载的视频”,我正在这样做:

private var mediaPlayer:MediaPlayerSprite;

private function _init(e:Event):void
{
    this.removeEventListener(Event.ADDED_TO_STAGE, _init);

    mediaPlayer = new MediaPlayerSprite();
    addChild(mediaPlayer);  
    //And here OSMF start to load the entire main_movie.f4v again.
    mediaPlayer.resource = new URLResource("f4v/main_movie.f4v");   
}
4

1 回答 1

0

如果您让视频完全下载,您的策略似乎会奏效。我假设如果视频完全下载,浏览器可能会缓存它并使其可供下一个NetStream出现。

否则,您的策略看起来不错。您正在做什么(播放,然后立即暂停视频)是开始缓冲视频的方式。但是由于有两个NetStream正在使用(一个由主加载器使用,另一个由 OSMF 播放器使用),这将不起作用。

也许您可以设计一个方案,NetStream将主加载程序中的文件传递给加载的 SWF (main.swf)。这样它就可以使用它已经下载的数据。只是一个想法,我从未尝试过这个。

另一个想法是让您的 main.swf 中的 OSMF 播放器进行缓冲。这意味着只有在加载 main.swf 之后才会开始缓冲(这可能为时已晚)。

于 2012-08-01T16:12:22.750 回答