2012-01-01 25 views
1

我的http服務器上有一些音頻文件,我想在ActionScript3中編寫一個Flash客戶端來加載這些音頻文件並順利播放。當然,我可以創建一個Sound對象並通過.load()加載URL請求。但爲了節省帶寬,我更願意按需加載音頻文件塊。例如,有一個音頻文件,我們說100MB。如果我們嘗試當用戶打開網頁使用Flash從不同文件無縫播放聲音軌道?

<--------- 100MB -----------> 

的下載可能會在幾分鐘內完成,但是我們要說,如果在中途用戶停止監聽器,這是一種浪費,在第一次加載整個配樂以最快的速度加載越好。

<--------- 100MB -----------> 
    ^--- user may stop here 

爲了解決這個問題,我認爲最好將大音頻文件分成小塊,根據需求加載和播放它們。

<--- 10MB ---><--- 10MB ---><--- 10MB ---> ... 
            ^--- user current position 

我想設計的播放器,讓它由塊加載音頻塊,只有當它接近當前塊的尾部加載它。

這裏提出的問題 - 如何加載這些塊並順利播放它們?我可以爲每個塊創建Sound對象。但是如何讓他們無縫地玩呢?

回答

1

您可能會想要使用SoundChannel,並在那裏看到exampletutorial。一旦你得到一個聲音加載,你可以播放聲音,存儲位置,並獲得長度,找出剩下的時間玩。從那裏,可能派遣一個事件來加載下一個聲音。來自第二個例子(您必須將其放在您的班級結構中):

// Note that you will need some type of sound management 
// class to listen to events and to play the series of sounds. 
// That is not documented here. 

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 

var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("sound1.mp3"); 
snd.load(req); 

var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 

function onEnterFrame(event:Event):void 
{ 
    var estimatedLength:int = 
     Math.ceil(snd.length/(snd.bytesLoaded/snd.bytesTotal)); 
    var playbackPercent:uint = 
     Math.round(100 * (channel.position/estimatedLength)); 
    if(playbackPercent > 75) 
     loadNextSound(); 
    trace("Sound playback is " + playbackPercent + "% complete."); 
} 

function loadNextSound() 
{ 
    // In whatever sound manager class you create, 
    // listen for this "loadNextSound" event, 
    // and start the next sound loading when it occurs. 
    dispatchEvent(new Event("loadNextSound")); 

} 


function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}