在AS3中使用声音跟AS2有很大的不同。先看下Flash帮助中的一些介绍,然后我们再使用导入到Flash中的声音做个小测试。
理解声音的结构
应用程序可以从4个地方加载声音:
- 运行时从外部声音文件里加载
- 内嵌到SWF文件里的声音资源
- 从连接到用户系统的麦克风上获取声音数据
- 从远程多媒体服务器,比如Flash Media Server获取声音流
可以等到声音全部加载后再播放,也可以边加载边播放。
ActionScript 3.0和Flash Player支持以mp3格式存储的声音。它们不能直接加载或播放其他格式的声音,比如WAV或AIFF。
使用Adobe Flash CS3 Professional,可以导入WAV或AIFF格式的声音,然后就可以把它们以MP3的格式嵌入到SWF文件中。Flash开发工具可以压缩嵌入的声音文件以减少文件大小,不过这样需要以降低声音质量的代价。 更多信息查看 "Importing Sounds" in Using Flash.
ActionScript3.0声音使用flash.media包中的下列类
类 | 描述 |
---|---|
flash.media.Sound | Sound类用来加载声音,管理声音的基本属性以及使声音开始播放 |
flash.media.SoundChannel | 当程序播放一个声音对象的时候,会创建一个新的SoundChannel对象控制播放。SoundChannel对象同时控制声音的左右频道。每个播放的声音都有自己的SoundChannel对象。 |
flash.media.SoundLoaderContext | SoundLoaderContext类指定当加载一个声音的时候使用多少秒的缓冲区,以及从服务器加载文件的时候FlashPlayer是否查找跨域策略文件。SoundLoaderContext对象作为 |
flash.media.SoundMixer | SoundMixer类控制程序中所有声音的回放及安全属性。实际上,多个声音频道通过一个共同的SoundMixer对象混合在一起,因此,SoundMixer对象的属性会影响正在播放的所有SoundChannel对象。 |
flash.media.SoundTransform | SoundTransform类包含用于控制音量和平衡的值。SoundTransform对象可以应用到一个单独的SoundChannel对象,全局的SoundMixer对象或者一个Microphone对象。 |
flash.media.ID3Info | ID3Info对象包含mp3文件中的ID3元数据信息。 |
flash.media.Microphone | Microphone类表示连接到用户电脑上的麦克风或者其他声音输入设备。从麦克风输入的音频可以传送到本地喇叭上或者远程服务器上。Microphone对象控制它自己声音流的取样率。 |
每个加载和播放的声音都需要它自己的Sound类和SoundChannel类。从多个SoundChannel实例输出的声音在播放中通过全局的SoundMixer混合在一起。
Sound,SoundChannel和SoundMixer类不能用在从麦克风或者流媒体服务器获取的声音上。
加载外部声音文件
Sound类的每个实例都用来加载和回放指定的声音。应用程序不能重复使用一个Sound对象加载多于一个的声音。如果想加载一个新的声音,需要创建一个新的声音对象。
如果加载一个小的声音文件,比如要附加在按钮上的点击声音,可以像下面这样创建一个新的Sound,然后让它自动加载声音文件:
- var req:URLRequest = new URLRequest("click.mp3");
- var s:Sound = new Sound(req);
Sound()
构造函数使用一个URLRequest对象作为第一个参数。当指定了URLRequest参数的时候,Sound对象就开始自动加载指定的声音文件。
除了这个最简单的情况之外,应用程序都应该注意声音的加载过程并监视加载过程中出现的错误。比如,如果这个点击声音特别的大,可能在用户点击按钮触发这个声音的时候这个声音文件还没有完全加载完。试图播放一个未加载完的声音可能导致一个运行期错误。安全的做法是等声音完全加载后再允许用户的那些可能导致声音播放的行为。
在声音加载过程中,Sound对象会发送几个不同的事件。应用程序可以监听这些事件来跟踪加载过程以确保声音在完全加载后才能播放。下表列出了声音对象可能发送的事件。
事件 | 描述 |
---|---|
open ( | 在声音加载操作刚开始时发送。 |
progress ( | 当从文件或者流中接收到数据的时候周期性的发送。 |
id3 ( | 当一个mp3声音的ID3数据可用时发送。 |
complete ( | 当声音的所有数据加载完后发送。 |
ioError ( | 如果声音文件不能定位或者加载过程中在所有数据接收完之前被中断的时候发送。 |
下面的代码演示了如何在声音加载完后播放一个声音:
- 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
. 下面的代码展示了如何使用这些事件显示声音的加载进度:
- 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()
方法显示简单的错误信息。
使用嵌入的声音
好了,下面我们把声音导入到库里使用。
打开Flash CS3,选择文件->导入到库,选择好声音,然后确定后会导入声音。打开库面板,找到我们导入的声音,右键,选择”linkage…”菜单
会弹出如下框,选择Export for ActionScript注意观察这个弹出框
它与AS2中明显不同的是,标识符栏(identifier栏)不能填写,而类(Class)和基类(Base class)栏必须填写。类的名字默认是声音的文件名,但是名字中只能能有字母数字,且以字母开头,因此图中的名字01.mp3是不合格的,可以改为mp3或其他符合规则的名字。基类就是flash.media.Sound。我们点确定,会弹出下框:
大意是指定的类”mp3″在类路径下找不到,在SWF文件导出时会自动为你创建一个类。点确定就可以了。
在帧上写如下代码:
- var drum:mp3 = new mp3();
- var channel:SoundChannel = drum.play();
导出,就可以听到声音了。