使用Flash从不同文件无缝播放声音轨道?
问题描述:
我的http服务器上有一些音频文件,我想在ActionScript3中编写一个Flash客户端来加载这些音频文件并顺利播放。当然,我可以创建一个Sound对象并通过.load()加载URL请求。但为了节省带宽,我更愿意按需加载音频文件块。例如,有一个音频文件,我们说100MB。如果我们尝试当用户打开网页使用Flash从不同文件无缝播放声音轨道?
<--------- 100MB ----------->
的下载可能会在几分钟内完成,但是我们要说,如果在中途用户停止监听器,这是一种浪费,在第一次加载整个配乐以最快的速度加载越好。
<--------- 100MB ----------->
^--- user may stop here
为了解决这个问题,我认为最好将大音频文件分成小块,根据需求加载和播放它们。
<--- 10MB ---><--- 10MB ---><--- 10MB ---> ...
^--- user current position
我想设计的播放器,让它由块加载音频块,只有当它接近当前块的尾部加载它。
这里提出的问题 - 如何加载这些块并顺利播放它们?我可以为每个块创建Sound对象。但是如何让他们无缝地玩呢?
答
您可能会想要使用SoundChannel
,并在那里看到example和tutorial。一旦你得到一个声音加载,你可以播放声音,存储位置,并获得长度,找出剩下的时间玩。从那里,可能派遣一个事件来加载下一个声音。来自第二个例子(您必须将其放在您的班级结构中):
// 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);
}