加载外部声音文件

Sound 类的每个实例都可加载并触发特定声音资源的播放。应用程序无法重复使用 Sound 对象来加载多种声音。要加载新的声音资源,应用程序需要创建另一 Sound 对象。

创建 Sound 对象

如果要加载较小的声音文件(例如,要附加到按钮上的单击声音),应用程序可以创建一个 Sound 对象,并让其自动加载该声音文件,如下例所示:

var req = new air.URLRequest("click.mp3"); 
var s = new air.Sound(req);

Sound() 构造函数接受一个 URLRequest 对象作为其第一个参数。在提供 URLRequest 参数的值后,新的 Sound 对象将自动开始加载指定的声音资源。

除了最简单的情况外,应用程序都应关注声音的加载进度,并监视在加载期间出现的错误。例如,如果单击声音文件非常大,则在用户单击触发该声音的按钮时,应用程序可能没有完全加载该声音。尝试播放已卸载的声音可能会导致运行时错误。较为稳妥的作法是等待声音完全加载后,再让用户执行可以启动声音播放的动作。

关于声音事件

Sound 对象将在声音加载过程中调度多种不同的事件。应用程序可以侦听这些事件以跟踪加载进度,并确保在播放之前完全加载声音。下表列出了 Sound 对象可以调度的事件:

事件

说明

open

( air.Event.OPEN )

在声音加载操作之前最后一刻进行调度。

progress

( air.ProgressEvent.PROGRESS )

在从文件或流接收到数据之后,在声音加载过程中定期进行调度。

id3

( air.Event.ID3 )

当存在可用于 mp3 声音的 ID3 数据时进行调度。

complete

( air.Event.COMPLETE )

在加载所有声音资源的数据后进行调度。

ioError

( air.IOErrorEvent.IO_ERROR )

在以下情况下进行调度:找不到声音文件,或者在收到所有声音数据之前加载过程中断。

以下代码说明了如何在完成加载后播放声音:

var s = new air.Sound(); 
s.addEventListener(air.Event.COMPLETE, onSoundLoaded); 
var req = new air.URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event) 
{ 
    var localSound = event.target; 
    localSound.play(); 
}

首先,该代码范例创建一个新的 Sound 对象,但没有为其指定 URLRequest 参数的初始值。然后,它通过 Sound 对象侦听 complete 事件,这将导致在加载完所有声音数据后执行 onSoundLoaded() 方法。接下来,它使用新的 URLRequest 值为声音文件调用 Sound.load() 方法。

在加载完声音后,将执行 onSoundLoaded() 方法。Event 对象的 target 属性是对 Sound 对象的引用。如果调用 Sound 对象的 play() 方法,则会启动声音播放。

监视声音加载过程

声音文件可能很大并需要很长时间进行加载,在通过 Internet 加载声音文件时尤为如此。应用程序可以在完全加载声音之前播放声音。您可能需要向用户指示已加载了多少声音数据以及已播放了多少声音。

Sound 类调度以下两个事件可使显示声音加载进度变得相对简单: progress complete 。以下示例说明了如何使用这些事件来显示有关所加载的声音的进度信息:

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

此代码先创建一个 Sound 对象,然后在该对象中添加侦听器以侦听 progress complete 事件。调用 Sound.load() 方法并从声音文件接收第一批数据之后,将发生 progress 事件,并触发 onSoundLoadProgress() 方法。

已加载的声音数据的小数部分等于 ProgressEvent 对象的 bytesLoaded 属性值除以 bytesTotal 属性后的值。Sound 对象上也提供了相同的 bytesLoaded bytesTotal 属性。

此示例还说明了应用程序在加载声音文件时如何识别并响应出现的错误。例如,如果找不到具有给定文件名的声音文件,则 Sound 对象将调度一个 ioError 事件。在上面的代码中,当发生错误时,将执行 onIOError() 方法并显示一条简短的错误消息。