加载外部声音文件

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

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

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

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

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

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

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

事件

说明

open ( Event.OPEN )

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

progress ( ProgressEvent.PROGRESS )

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

id3 ( Event.ID3 )

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

complete ( Event.COMPLETE )

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

ioError ( IOErrorEvent.IO_ERROR )

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

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

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() 方法,则会启动声音播放。

监视声音加载过程

声音文件可能很大,而需要花很长时间进行加载。尽管 Flash Player 和 AIR 允许应用程序甚至可以在完全加载声音之前播放声音,但您可能希望向用户指示已加载了多少声音数据以及已播放了多少声音。

Sound 类调度以下两个事件,它们可使声音加载进度显示变得相对比较简单: ProgressEvent.PROGRESS Event.COMPLETE 。以下示例说明了如何使用这些事件来显示有关所加载的声音的进度信息:

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 值更新进度栏组件,例如 Adobe Flex 框架或 Adobe Flash 创作工具附带的组件。

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