湘教在线

当前位置:首页>课件专栏>动画制作>正文

让课件“闪”起来(4)-声音的控制

√湘教在线   点击次数:  来源:[2005-10-16 22:15:57] 进入论坛

一个成功的课件不能缺少声音,音效、背景音乐、解说词……这些都需要声音的支持。声音格式的种类繁多,在Flash中调用声音的方法也有许多,下面就笔者在Flash的声音使用中积累的一些经验与大家做做探讨。

一、波形声音的相关知识
1、采样率、录制模式和位深度
声音有许多种格式,在Flash中,使用最多的是wav格式和mp3格式。它们都是波形类声音,它们的文件大小和品质和以下三个要素息息相关:采样速率、录制模式和位深度。
采样率就是将自然界中的模拟声音转换倒计算机上时的频率。例如,44.1kHz采样率指的是声音每秒钟被采样44100次。大多数情况下,11.025kHz采样率对语音录制的效果就不错。而使用22.05kHz采样率录制音乐也能构得到比较理想的效果。采样率越高,录制的效果就越好,得到的声音文件也越大。音乐CD就使用了44.1kHz的采样率。
录制模式指在录制时采用双声道录音还是使用单声道录音。如果没有特殊要求,尽量不要在课件中使用双声道音频。在同样的采样率下,双声道文件的大小是单声道文件的两倍。
为了进一步降低文件大小,经常将16位的音频转换为8位。8位的声音较之16位的声音,背景噪声加大,声音细节丢失比较严重,质量较差。但是,8位的声音占用更少的空间。
在采样率和位深度中,可以通过比较找到一个平衡点。如:虽然11.25kHz采样率16位的音乐和22.5kHz采样率8位的音乐文件大小相似,但前者质量明显优于后者。
表1列举了采用不同采样速率和录音模式的同一段声音文件的大小。此声音的长度为74秒。
表1


2.wav和mp3
WAV格式是Windows系统中通用的波形文件。Flash可以导入WAV文件,并支持WAV文件的ADPCM压缩。单ADPCM算法的压缩比和音质远不及MP3,因此不推荐在Flash中使用。
MP3格式实际上也是波形文件,只是对波形文件进行了压缩,去掉了一些人耳无法辨别的信息。Flash MX可以导入MP3格式的文件,也可以将导入的WAV文件在导出时压缩成MP3。MP3并不是MPEG3标准的缩写,而是MPEG1 layer3的缩写,也就是MPEG1压缩的第三层。MP3格式的压缩率可以达到10:1,而且音质没有太大的不同。在Flash中,使用的音频格式应该首选MP3。如图1所示


图1 Flash中对声音文件的压缩
在选择mp3压缩码率(比特率)时,MP3以kbps(千位每秒)为单位。在Flash中,默认的码率是16kbps。这样的码率已经能够满足大多数音乐或语音文件的需求。可以根据不同的需要为不同的文件选择不同的码率。语音文件一般16kbps至32kbps就足以满足要求。音乐文件可以使用32-64kbps的码率。码率越大,声音质量越好,文件尺寸也越大。在Flash课件中,没有必要使用高于64kbps码率的声音文件。
表2展示了一段采样率22.5kHz、16位、长6.6秒的立体声WAV格式音乐使用不同码率压缩时的文件大小。原文件大小为486KB。
表2

压缩码率(kbps) 声道 大小(KB) 用途
128 立体声 89 不推荐在Flash中使用
128 单声道 89
64 立体声 45 质量要求较高的音乐。
64 单声道 45
32 立体声 23 背景音乐,音效。质量要求较高的语音。
32 单声道 23
16 立体声 12 要求较低的音乐,普通语音。
16 单声道 12
由表可知,在使用MP3压缩时,在相同码率的情况下,单声道和立体声所占用的存储空间是相同的。但是,立体声的文件在播放时可能会占用更多的CPU资源,因此如果没有特殊要求,在课件制作中没有必要使用立体声。

二、“事件”声音的尴尬
我们知道,Flash可以用“事件”方式和“数据流”方式调用声音。这两种方法各有优缺点,下面将结合实例首先对“事件”方式进行介绍。
1.播放声音
“事件”方式将声音一次性载入内存进行播放,而且必须等待载入完毕才开始播放。“事件”方式会将声音和一个事件的发生过程同步起来。事件声音在它的起始关键帧开始显示时播放,并独立于时间轴播放完整个声音,即使影片停止也继续播放。
下面来看一个例子。
①新建一个Flash影片,导入一段音乐。如图2所示


图2 导入声音
②新建一个按钮元件,绘制出一个矩形按钮,在“指针经过”帧设置声音,“同步”选项设为“事件”。如图3所示


图3 设置声音

③将按钮放置到舞台上,将鼠标移动到按钮上,每移动一次,设置的声音就完整地播放一次,不管前一个声音是否停止。于是,当快速多次将鼠标置于此按钮上方时,所有的声音会混合在一起,感觉非常杂乱。笔者将这种现象称为“重音”现象。
怎样解决这个问题呢?方法是将“同步”选项设为“开始”。“开始”选项也是使用“事件”方式调用声音,只是如果这个声音正在播放,就不会重新播放新的声音。若将这个按钮中声音设置为“开始”,则不论移动鼠标多少次至按钮上,只要声音没有停下来,就只会播放一次。如图4所示。

图4 设置声音同步

2.停止声音
在上例中,声音只有一帧,也同样会播放完,这就是事件声音的特点——与时间轴不同步。如果想停止这个声音,该怎么办呢?我们仍旧使用此例讲解。
在按钮元件的“按下”帧插入关键帧,仍然选择此声音,将“同步”选项改为“停止”即可。当鼠标移动到按钮上时,会播放声音,单击按钮时,停止刚才播放的声音。如图5所示。



图5 停止指定声音

需要强调的是,声音不一定必须设置在同一个元件当中。如果在主时间轴中有一个事件声音正在播放,在按钮中设置让此声音停止的同步选项也是可以的。
这种方法只能停止指定的声音,如果要停止所有的声音,可以使用stopAllSounds()函数。例如,将下面的代码写在按钮上,按下按钮将停止所有的声音。
on(press){
stopAllSounds();
}
虽然使用“事件”方式播放声音非常简单,只需要在关键帧上设置就可以了,但却不能让我们很好地控制。它和时间轴不同步,不能随意停止,如果设置不好还会出现重音现象。因此,笔者一般将其应用在较短的音效上,对于较长的音乐或解说,笔者一般使用“数据流”方式。
三、做一个“声音MC”
MC是“影片剪辑”的缩写,“声音MC”就是仅包含声音的影片剪辑。在这个影片剪辑中,我们采用“数据流”方式播放声音。“数据流”方式和时间轴同步,它将声音信息按照帧分成许多块,如果动画的速度过快,有些帧的声音块不能播放,它就会跳过这些块中的声音。“数据流”方式便于制作和动画演示同步的声音效果。例如,使用Flash制作MV,为了让歌词和歌曲同步,就必须使用“数据流”方式。
下面结合一个例子来讲解“声音MC”的制作。
舞台中有“上一页”、“下一页”和“开始解说”三个按钮,要求单击“开始解说”后播放解说声音,单击“上一页”或“下一页”按钮跳到相应的页并播放跳转到的页中的解说声音。
此例经常应用于幻灯片中,在每页中有不同的解说词对所展示的内容进行解释。每页中的解说都是独立的。如果使用事件声音制作,则在上一页和下一页中都要设置停止这一页解说的关键帧,停止的同时还要开始本页解说的播放,相当繁琐。如果使用“声音MC”,则很容易解决。
①新建一个影片剪辑,在此剪辑的第一帧中输入stop()函数,在第二帧插入关键帧,选择已导入的需要播放的声音文件,设置“同步”方式为“数据流”方式,并延长此帧一直到波形显示完毕。数据流方式的声音与时间轴同步,如果这里的帧不够长,那么声音就只会播放显示的部分。在最后一帧插入关键帧,并输入stop()函数。
由于解说词是在单击按钮后才开始播放的,而且播放后停止,因此在“声音MC”的第一帧和最后一帧都要设置停止函数。如图6所示。

图6 声音MC内部时间轴

②将声音MC放置在舞台上,将其实例命名为“sound_mc”。如图7所示。

图7 声音MC的实例名
③在舞台上放置三个按钮,分别为“播放声音”,“上一页”和“下一页”。在“开始解说”按钮上写入如下脚本:
on(release){
sound_mc.gotoAndPlay(2);
}
“上一页”按钮的脚本:
on(release){
prevFrame();
}
“下一页”按钮的脚本
on(release){
nextFrame();
}
④单击“开始解说”按钮,sound_mc的内部时间轴开始播放,声音也随之播放。
⑤单击“上一页”或“下一页”按钮,由于页面中没有“声音MC”了,正在播放的声音会立即停止。
⑥由于sound_mc内部时间轴的最后一帧有stop()命令,所以此解说播放一遍后会自动停止。
⑦要sound_mc自动播放,删除sound_mc内部时间轴第一帧中的stop()命令即可。
⑧如果需要一个“停止解说”按钮,只需要在按钮上加入如下代码:
on(release){
sound_mc.gotoAndStop(1);
}
“声音MC”对声音的控制相当灵活,通过对其时间轴的控制,可以随时停止或播放声音。还可以在一个“声音MC”中放置多个声音,通过帧标签控制其内部时间轴的跳转,以实现选择曲目的功能。笔者经常使用“声音MC”制作大段的解说词和背景音乐。
当然,“数据流”方式也有缺点,在使用相同的压缩率的情况下,数据流方式明显比事件方式的声音质量差,这是由于“数据流”方式将声音文件分割成小块造成的。笔者曾试图通过调整压缩率减小声音质量造成的影响,但收效不大。

四、使用声音对象
除了使用“事件”方式和“数据流”方式调用声音之外,还可以使用声音对象。声音对象不像前面两者那样要受时间轴的限制,可以实现更加灵活的声音控制,如:使用脚本随时停止声音,设置声音从中间开始播放,得到声音的长度,实时调整声音大小,设置声音平衡等等,甚至可以直接控制硬盘中的mp3文件!下面将结合实例讲解声音对象在课件中的应用。
1.链接库中的声音
①一个Flash影片,导入一个声音文件。在库中使用右键单击这个声音文件,在弹出的快捷菜单中选择“链接”命令,在随后弹出的“链接属性”对话框中选择“为动作脚本导出”和“在第一帧导出”,将“标识符”设为“testSound”。如图8所示。


图8 链接声音
②影片的第一帧写入如下脚本:

//建立一个名为test_sound的声音对象
test_sound=new Sound();
//把库中标识符为“testSound”的声音链接到test_sound声音对象
test_sound.attachSound("testSound");

③接着,就可以直接对这个声音对象操作了。例如,播放这个声音的脚本是:
test_sound.start();
④如果希望从这个声音的第1.4秒的地方开始播放,则脚本如下:
test_sound.start(1.4);
⑤如果希望从头播放并循环100遍,则脚本如下:
test_sound.start(0,100);

⑥停止这个声音的脚本就更简单:
test_sound.stop();

⑦设置当前音量为50%:
test_sound.setVolume(50);

⑧仅使用左声道(扬声器):
test_sound.setPan(-100);
仅使用右声道(扬声器):
test_sound.setPan(100);

⑨得到音乐已经播放的时间(毫秒)
currentPosition = test_sound.position;
得到音乐的总长度(毫秒)
soundLength = test_sound.position;

2.载入硬盘中的声音文件
从Flash MX开始,Flash能够直接从硬盘中载入MP3文件了!这意味着我们只需要改变外部的MP3文件就可以改变Flash中的音乐了,也不用将巨大的歌曲文件导入到Flash内部了。我们甚至可以用这个功能制作一个MP3播放器!更重要的是,它用起来非常简单!新建一个Flash影片,将下面的代码写入第一帧。
//首先当然要建立一个声音对象
mp3_sound=new Sound();
//载入和Flash文件相同目录下的mylove.mp3文件
mp3_sound.loadSound(“mylove.mp3”,false);

loadSound函数有两个参数,第一个参数描述要载入的MP3文件的位置(注意,必须是MP3文件),可以使用相对路径。例如,如果这个MP3文件在子目录music中,则上句写成:
mp3_sound.loadSound(“music/mylove.mp3”,false);
第二个参数决定是以“事件”方式载入还是以“数据流”方式载入。如果为ture,则使用数据流方式载入,只要载入的音乐数据足够启动解码器,声音就会自动播放;如果为false,则是事件方式,只有在声音文件全部载入后才能够使用mp3_sound.start()进行播放。笔者一般使用事件方式载入声音,这种方式控制起来比较容易。
判断外部MP3文件是否已经完全载入的语句如下:
mp3_sound.onLoad=function(){
soundLoaded=”ok”;
}
当确定外部MP3文件已经完全载入后,就可以像链接库中的声音一样使用它了。

3.做一个音量滑块
音量滑块是课件中常用的功能。下面将制作一个通用的音量滑块,不过如果要将它用在你的课件中,可还需要好好美化一下呀^_^
①首先制作一个按钮元件(或影片剪辑),拖动它的一个实例到舞台上,将实例命名为“vol”,在vol下方绘制一根高度100象素的竖线,在vol上方放置一个动态文本域,其关联变量为level。如图9所示



图9 准备素材

②选中这三个对象(按钮、动态文本和直线),按F8键将它们转换成一个影片剪辑,命名为“音量控制”。如图10所示。

图10 转换成影片剪辑
为什么要转换成影片剪辑呢?因为转换后,这个音量滑块就独立出来了,任何时候需要使用这个滑块的时候,将这个影片剪辑拷贝到需要使用的影片中就行了。这也符合模块化的制作思想。
③接下来处理声音对象,在主时间轴的第一帧写入如下脚本:
mp3_sound = new Sound();
mp3_sound.loadSound("mylove.mp3", true);
这里以数据流的方式载入mylove.mp3音乐文件,载入的音乐会自动播放。
④进入“音量控制”影片剪辑内部进行编辑。单击“音量剪辑”内部时间轴的第一帧,输入以下脚本:
//限定“vol”能够被拖动的范围,为了避免level值出现小数,使用Math.ceil()函数将vol._y进一位
top = Math.ceil(vol._y);
left = vol._x;
right = vol._x;
bottom = top+100;
level = 100;
//在vol按钮上按下鼠标时拖动
vol.onPress = function() {
startDrag("vol", false, left, top, right, bottom);
dragging = true;
};
//在 vol按钮上释放鼠标时停止拖动
vol.onRelease = function() {
stopDrag();
dragging = false;
};
//在外部释放鼠标也同样停止拖动
vol.onReleaseOutside = function() {
dragging = false;
};
//下面的代码每秒执行12次
this.onEnterFrame = function() {
//如果当前正在拖动音量滑块则根据当前vol的位置确定level的值
if (dragging) {
level = 100-(vol._y-top);
} else {
//一旦停止拖动音量滑块就就检验level值是否超出限度,超出限度就设定level值为最大限度(或最小限度)
if (level>100) {
level = 100;
}
if (level<0) {
level = 0;
}
}
//设定声音对象的音量值(由于声音对象是在主时间轴中定义的,所以要加上关键字_parent)
_parent.mp3_sound.setVolume(level);
};
⑤滑块完成,可以测试一下影片了。本例中是使用数据流方式载入外部的MP3文件的,因此音乐会自动播放。如果不希望这样,可以使用事件方式载入外部MP3文件,然后使用Sound.start()命令触发它。

好了,关于声音的控制就讲到这里吧。下一章将探讨Flash中的视频运用。本文中涉及到的所有源程序都可以在http://www.caispace.com下载。

分类信息
湘教在线,更多精彩在首页,
湘ICP备08101769号 - 给湘教在线提意见
网站介绍 - 广告服务 - 联系我们 - 网站导航 - 黄金会员 - 服务承诺 - 诚聘高手 -
湘教在线版权所有
©2003-2008