2012-01-01 67 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); 
}