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来るときに利用できるようにすることができると思います。

それ以外の場合、あなたの戦略は問題ないように見えます。あなたがしていること (ビデオを再生してすぐに一時停止すること) は、ビデオのバッファリングを開始する方法です。しかし、2 つNetStreamの が使用されているため (1 つはメイン ローダーによって、もう 1 つは OSMF プレーヤーによって)、これは機能しません。

NetStreamおそらく、メイン ローダーから読み込まれた SWF (main.swf)に を渡すスキームを考案できます。すでにダウンロードしたデータを使用できるようにします。考えただけで、私はこれを試したことはありません。

もう 1 つのアイデアは、main.swf で OSMF プレーヤーを取得してバッファリングを行うことです。これは、main.swf がロードされた後にのみバッファリングが開始されることを意味します (遅すぎる可能性があります)。

于 2012-08-01T16:12:22.750 に答える