as3 加载外部声音文件问题详细剖析

2019-10-08 15:02:53刘景俊

比如,首先像下面这样加载并播放一个声音:
ActionScript Code:

复制代码
var snd:Sound = new Sound(new URLRequest("bigSound.mp3"));
var channel:SoundChannel = snd.play();

当声音播放的时候SoundChannel.position属性显示声音当前的播放位置.程序可以像下面这个例子一样,在停止它之前记录下它的位置:
ActionScript Code:

复制代码
var pausePosition:int = channel.position;
channel.stop();

要重新播放声音,传递之前记录的播放位置数据来使声音从它停止的地方重新开始播放.
ActionScript Code:

复制代码
channel = snd.play(pausePosition);

监视播放
你的程序可能需要知道什么时候它停止了播放,以便去播放另一个声音,或者清除在播放过程中使用的一些资源.当声音播放完毕的时候SoundChannel类发送一个Event.SOUND_COMPLETE事件. 你的程序可以监听这个事件并作出适当的动作,就像下面这样:
ActionScript Code:

复制代码
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound("smallSound.mp3");
var channel:SoundChannel = snd.play();
s.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
}

SoundChannel类在播放中并不发送进度事件.要报告播放进度,你可以自己设置一个时间进制并跟踪播放头的位置.
可以使用SoundChannel.position属性值除以声音长度来计算已播放的百分数:
ActionScript Code:

复制代码
var playbackPercent:uint = 100 * (channel.position / snd.length);

但是,只有在播放前声音全部加载完了,这段代码才能精确显示播放的百分比.Sound.length属性显示的是当前已加载的声音长度,而不是声音文件的的真实长度.你可以使用Sound对象的bytesLoaded和bytesTotal属性估计声音的长度:
ActionScript Code:

复制代码
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);

下面的代码加载一个比较大的声音文件,并使用Event.ENTER_FRAME事件作为显示播放进度的时间机制.它周期性的报告播放的百分比,这个百分比是用当前位置除以声音总长度计算出来的:
ActionScript Code:

复制代码
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new
URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
snd.load(req);