2012-07-31 76 views
0

我的項目有一個加載項目所有資產的主加載程序。我需要加載一點我的視頻。用主工程加載程序預加載一點FLV或F4V

該視頻有16MB,我想加載3MB,在主加載程序完成後使用。

我試圖用Netconnection/Netstream打開一個新的連接來加載3mb並關閉連接,但是當項目啓動並且播放視頻時,打開一個新的連接從開始加載它。

我試圖找到一種方法,我可以使用那些3mb已經加載。這樣做,用戶不需要等待主裝載機和輔助裝載機(buffertime)。

這是我的代碼,對不起傢伙。

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"); 
} 
+0

你的代碼是什麼? – SomeKittens 2012-07-31 21:19:19

回答

0

它看起來像如果你讓視頻下載完全按照自己的策略是可行的。我假設如果視頻完全下載,瀏覽器可能會緩存它,並將其提供給下一個NetStream

否則您的策略看起來不錯。你在做什麼(播放,然後立即暫停視頻)是開始緩衝視頻的方式。但是由於有兩個NetStream被使用(一個是主裝載器,另一個是OSMF播放器),這是行不通的。

也許你可以設計一個方案,將主裝載器中的NetStream傳遞到加載的SWF(main.swf)中。以便它可以使用它已經下載的數據。只是一個想法,我從來沒有試過這個。

另一個想法是讓你的main.swf中的OSMF播放器做緩衝。這意味着只有在加載main.swf之後緩衝纔會開始發生(這可能太晚了)。

+0

你是對的Sunil,我想在這兩個文件中使用相同的NetStrem。我會嘗試在主加載器中使用一個靜態變量來放置我的NetStream,然後當我的播放器被加載時,我可以訪問NetStream來播放我的視頻。我不想使用靜態變量,因爲它看起來不對且很髒,即使我想爲了獲得最佳的用戶體驗而做。 – 2012-08-01 18:13:02