前两种方法是各有各的长处,各有各的短处。如果是比较小比较短的音效,比如按钮上的响应声音,用第一种方法会很方便;而如果是一首歌或一首舞曲,应该用第二种方法,虽然要编写复杂的脚本,但是就可以方便的处理各种声音,并不用担心导出文件过大的问题。至于第三种方法则是前两种方法的合并,既有前两种方法的优点,也有前两种方法的缺点,这里就不细说第三种方法了。
先说说第一种方法,首先说说 FlashCS3 支持导入的声音格式:
WAV(仅限 Windows);
AIFF(仅限Macintosh);
mp3(Windows或 Macintosh);
如果系统上安装了QuickTime 4 或更高版本,则可以导入这些附加的声音文件格式:
AIFF(Windows或 Macintosh);
SoundDesigner II(仅限 Macintosh);
只有声音的QuickTime 影片(Windows 或 Macintosh);
SunAU(Windows 或 Macintosh);
System 7声音(仅限 Macintosh);
WAV(Windows或 Macintosh);
比较常见的 WMA 格式是不支持的,无法使用。
声音的导入和使用比较简单,选择“文件”>“导入”>“导入到库”,在“导入”对话框中,打开所需的声音文件。使用的话就更简单了,直接选择要加入声音的时间轴,直接把声音从库里拖入舞台或者在“属性”检查器中,从“声音”弹出菜单中选择声音文件。
这里主要说说声音的效果,“效果”弹出菜单中的效果选项:
无:不对声音文件应用效果,选中此选项将删除以前应用的效果。
左声道/右声道:只在左声道或右声道中播放声音。
从左到右淡出/从右到左淡出:会将声音从一个声道切换到另一个声道。
淡入:随着声音的播放逐渐增加音量。
淡出:随着声音的播放逐渐减小音量。
自定义:允许使用“编辑封套”创建自定义的声音淡入和淡出点。
同步选项:
事件:会将声音和一个事件的发生过程同步起来。事件声音(例如,用户单击按钮时播放的声音)在显示其起始关键帧时开始播放,并独立于时间轴完整播放,即使 SWF 文件停止播放也会继续。当播放发布的 SWF 文件时,事件声音会混合在一起。如果事件声音正在播放,而声音再次被实例化(例如,用户再次单击按钮),则第一个声音实例继续播放,另一个声音实例同时开始播放。
开始:与“事件”选项的功能相近,但是如果声音已经在播放,则新声音实例就不会播放。
停止:使指定的声音静音。
流:将同步声音,以便在网站上播放。 Flash 强制动画和音频流同步。 如果 Flash 不能足够快地绘制动画的帧,就跳过帧。与事件声音不同,音频流随着 SWF 文件的停止而停止。 而且,音频流的播放时间绝对不会比帧的播放时间长。 当发布 SWF文件时,音频流混合在一起。音频流的一个示例就是动画中一个人物的声音在多个帧中播放。
重复:输入一个值,以指定声音应循环的次数,或者选择“循环”以连续重复声音。这里要特别注意:如果将音频流设为循环播放,帧就会添加到文件中,文件的大小就会根据声音循环播放的次数而倍增。
你可能会发现一些问题,上面的功能看似挺多,但是竟然连播放暂停这两个基本功能都没有,尽管可以用 音频流的方法制作播放、暂停、停止、无限循环等效果(其实就是把声音文件放入一个影片剪辑里,然后将同步选项选为流,再控制这个影片剪辑的方法),但是效果会大打折扣,不信你可以试试,所以说第一种方法最好还是用来处理简单的音效好一点。
要能更加全面的控制声音,只能用第二种方法,使用强大的 Sound类,不但能做出第一种方法能做出的所有效果,而且通过这个类和其它几个和声音有关的类,你甚至可以开发出一款有多种功能的 Flash音乐播放器,由此可看出 Flash 处理声音的强大。
首先扫一下大家的兴,因为 Sound 类仅能处理 mp3 类型的音乐文件,在 AS以后的版本里应该可以得到改善,这里给出一个简单的播放、暂停、停止、循环加上有音乐频谱显示的简单(好像没说的这么简单吧-_-!)播放器的源码,而音乐频谱显示是AS3 里新增加的效果,算是一个难点:
//建立声音对象。
var mySound:Sound = new Sound();
//载入声音。
mySound.load(new URLRequest("心水.mp3"));
//建立 SoundChannel 对象。
var myChannel:SoundChannel;
//记录播放进度的变量。
var time:uint;
//播放按钮。
Btn_play.addEventListener(MouseEvent.CLICK,_play);
function _play(e:MouseEvent):void {
if (L_now.text=="当前状态:暂停") {
myChannel =mySound.play(time);
//为循环加上事件。
myChannel.addEventListener(Event.SOUND_COMPLETE,_cycleSong);
L_now.text="当前状态:播放";
}
}
//暂停按钮。
Btn_pause.addEventListener(MouseEvent.CLICK,_pause);
function _pause(e:MouseEvent):void {
if (L_now.text=="当前状态:播放") {
time =myChannel.position;
myChannel.stop();
L_now.text="当前状态:暂停";
}
}
//停止按钮。
Btn_stop.addEventListener(MouseEvent.CLICK,_stop);
function _stop(e:MouseEvent):void {
time=0;
myChannel.stop();
L_now.text="当前状态:暂停";
}
//循环按钮。
Btn_cycle.addEventListener(MouseEvent.CLICK,_cycle);
function _cycle(e:MouseEvent):void {
if (Btn_cycle.label=="循环(关)") {
Btn_cycle.label="循环(开)";
} else {
Btn_cycle.label="循环(关)";
}
}
//真正的循环代码。
function _cycleSong(e:Event):void {
if (Btn_cycle.label=="循环(开)") {
myChannel =mySound.play();
//为循环加上事件。
myChannel.addEventListener(Event.SOUND_COMPLETE,_cycleSong);
} else {
time=0;
L_now.text="当前状态:暂停";
myChannel.stop();
}
}