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

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

下面的代码演示了如何在声音加载完后播放一个声音:
ActionScript Code:

复制代码
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var s:Sound = new Sound();
s.addEventListener(Event.COMPLETE, onSoundLoaded);
var req:URLRequest = new URLRequest("bigSound.mp3");
s.load(req);
function onSoundLoaded(event:Event):void
{
var localSound:Sound = event.target as Sound;
localSound.play();
}

首先,这段示例代码创建了一个新的Sound对象,但并没有指定URLRequest参数。然后,它监听Sound对象的Event.COMPLETE事件,当所有声音数据加载完后执行onSoundLoaded()方法。接下来,它使用一个新的URLRequest值调用Sound.load()方法。
当声音全部加载完后执行onSoundLoaded()方法。Event对象的target属性是Sound对象的引用。调用Sound对象的play()方法开始播放声音。
监视声音加载过程
声音可能非常大,加载需要相当长的时间。FlashPlayer允许在声音全部加载完前就能播放,你可能想想给用户一个显示声音加载了多少以及播放了多少。
Sound类的两个事件使得显示加载进度变得相当容易: ProgressEvent.PROGRESS和Event.COMPLETE. 下面的代码展示了如何使用这些事件显示声音的加载进度:
ActionScript Code:

复制代码
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.media.Sound;
import flash.net.URLRequest;
var s:Sound = new Sound();
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
s.addEventListener(Event.COMPLETE, onLoadComplete);
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
var req:URLRequest = new URLRequest("bigSound.mp3");
s.load(req);
function onLoadProgress(event:ProgressEvent):void
{
var loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal));
trace("The sound is " + loadedPct + "% loaded.");
}
function onLoadComplete(event:Event):void
{
var localSound:Sound = event.target as Sound;
localSound.play();
}
function onIOError(event:IOErrorEvent)
{
trace("The sound could not be loaded: " + event.text);
}

这段代码首先创建了一个Sound对象,然后为事件ProgressEvent.PROGRESS和Event.COMPLETE添加监听器。在调用了Sound.load()方法及收到第一组数据后,开始出现ProgressEvent.PROGRESS事件,触发onSoundLoadProgress() 方法。
声音加载的百分比等于ProgressEvent对象的bytesLoaded属性除以bytesTotal属性。在Sound对象上同样可以获取bytesLoaded和bytesTotal。上面的代码简单展示了声音加载信息,但是你可以使用bytesLoaded和bytesTotal值来控制进度条组件。
这段代码同样展示了如何组织和响应加载中发生的错误。比如,如果无法定位指定的声音文件,会发送Event.IO_ERROR事件。前面代码中当发生错误时会调用onIOError()方法显示简单的错误信息。