FLASH AS3声音处理Word文档下载推荐.docx
《FLASH AS3声音处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《FLASH AS3声音处理Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
![FLASH AS3声音处理Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/2/54ddf221-a51f-4d56-a42e-6713c5b764d0/54ddf221-a51f-4d56-a42e-6713c5b764d01.gif)
∙在加载的同时播放声音流
∙控制音量和声相
∙从mp3文件中检索ID3元数据
∙使用原始声音波形数据
∙从用户麦克风捕获并重新播放声音输入
重要概念和术语
以下参考列表包含您将会在本章中遇到的重要术语:
∙波幅(Amplitude):
声音波形上的点与零或平衡线之间的距离。
∙比特率(Bitrate):
每秒为声音文件编码或流式传输的数据量。
对于mp3文件,比特率通常是以每秒千位数(kbps)来表述的。
较高的比特率通常意味着较高品质的声音波形。
∙缓冲(Buffering):
在回放之前接收和存储声音数据。
∙mp3:
MPEG-1AudioLayer3(mp3)是一种常用的声音压缩格式。
∙声相(Panning):
将音频信号放在立体声声场中左声道和右声道之间。
∙峰值(Peak):
波形中的最高点。
∙采样率(Samplingrate):
定义在生成数字信号时每秒从模拟音频信号采集的样本数。
标准光盘音频的采样率为44.1kHz或每秒44,100个样本。
∙流式传输(Streaming):
此过程是指,在仍从服务器加载声音文件或视频文件的后面部分的同时播放该文件的前面部分。
∙音量(Volume):
声音的响度。
∙波形(Waveform):
声音信号波幅随时间变化的图形形状。
完成本章中的示例
学习本章的过程中,您可能希望测试某些示例代码清单。
由于本章介绍了在ActionScript中处理声音,因此许多示例都涉及对声音文件的处理,例如,播放声音文件、停止回放或以某种方式调整声音。
测试本章中的示例:
1.创建一个新的Flash文档并将它保存到您的计算机上。
2.在时间轴上,选择第一个关键帧,然后打开"
动作"
面板。
3.将示例代码清单复制到"
脚本"
窗格中。
4.如果代码涉及加载外部声音文件,则其中会有一行与下面的代码类似的代码:
5.varreq:
URLRequest=newURLRequest("
click.mp3"
);
6.vars:
Sound=newSound(req);
其中"
是要加载的声音文件的名称。
为了测试这些示例,需要有一个可使用的mp3文件。
应将此mp3文件放入Flash文档所在的文件夹中。
然后应更改代码以使用mp3文件的名称,而不是代码清单中的名称(例如,在上面的代码中,将"
改为mp3文件的名称)。
7.从主菜单中,选择"
控制"
>
"
测试影片"
以创建SWF文件并预览(并且听一下)示例的输出。
除了播放音频外,某些示例将使用trace()函数来显示值;
当测试这些示例时,将会在"
输出"
面板中看到这些值的结果。
一些示例还将内容绘制到屏幕上,因此对于这些示例,您还将在FlashPlayer窗口中看到内容。
了解声音体系结构
应用程序可以从以下四种主要来源加载声音数据:
∙在运行时加载的外部声音文件
∙在应用程序的SWF文件中嵌入的声音资源
∙来自连接到用户系统上的麦克风的声音数据
∙从远程媒体服务器流式传输的声音数据,如FlashMediaServer
可以在回放之前完全加载声音数据,也可以进行流式传输,即在仍进行加载的同时回放这些数据。
ActionScript3.0和FlashPlayer支持以mp3格式存储的声音文件。
使用AdobeFlashCS3Professional,可以导入WAV或AIFF声音文件,然后将其以mp3格式嵌入应用程序的SWF文件中。
Flash创作工具还可压缩嵌入的声音文件以减小文件大小,但会降低声音的品质。
有关详细信息,请参阅《使用Flash》中的"
导入声音"
。
ActionScript3.0声音体系结构使用flash.media包中的以下类。
类
描述
flash.media.Sound
Sound类处理声音加载、管理基本声音属性以及启动声音播放。
flash.media.SoundChannel
当应用程序播放Sound对象时,将创建一个新的SoundChannel对象来控制回放。
SoundChannel对象控制声音的左和右回放声道的音量。
播放的每种声音具有其自己的SoundChannel对象。
flash.media.SoundLoaderContext
SoundLoaderContext类指定在加载声音时使用的缓冲秒数,以及FlashPlayer在加载文件时是否从服务器中查找跨域策略文件。
SoundLoaderContext对象用作Sound.load()方法的参数。
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类的实例。
然后,全局SoundMixer类在回放期间将来自多个SoundChannel实例的输出混合在一起。
Sound、SoundChannel和SoundMixer类不能用于从麦克风或流媒体服务器(如FlashMediaServer)中获取的声音数据。
加载外部声音文件
Sound类的每个实例可加载并触发特定声音资源的回放。
应用程序无法重复使用Sound对象来加载多种声音。
如果它要加载新的声音资源,则应创建一个新的Sound对象。
如果要加载较小的声音文件(如要附加到按钮上的单击声音),应用程序可以创建一个新的Sound,并让其自动加载该声音文件,如下所示:
varreq:
vars:
Sound()构造函数接受一个URLRequest对象作为其第一个参数。
当提供URLRequest参数的值后,新的Sound对象将自动开始加载指定的声音资源。
除了最简单的情况下,应用程序都应关注声音的加载进度,并监视在加载期间出现的错误。
例如,如果单击声音非常大,在用户单击触发该声音的按钮时,该声音可能没有完全加载。
尝试播放未加载的声音可能会导致运行时错误。
较为稳妥的作法是等待声音完全加载后,再让用户执行可能启动声音播放的动作。
Sound对象将在声音加载过程中调度多种不同的事件。
应用程序可以侦听这些事件以跟踪加载进度,并确保在播放之前完全加载声音。
下表列出了可以由Sound对象调度的事件。
事件
open(Event.OPEN)
就在声音加载操作开始之前进行调度。
progress(ProgressEvent.PROGRESS)
从文件或流接收数据时,在声音加载过程中定期进行调度。
id3(Event.ID3)
当存在可用于mp3声音的ID3数据时进行调度。
complete(Event.COMPLETE)
在加载了所有声音资源后进行调度。
ioError(IOErrorEvent.IO_ERROR)
在以下情况下进行调度:
找不到声音文件,或者在收到所有声音数据之前加载过程中断。
以下代码说明了如何在完成加载后播放声音:
importflash.events.Event;
importflash.media.Sound;
import.URLRequest;
Sound=newSound();
s.addEventListener(Event.COMPLETE,onSoundLoaded);
bigSound.mp3"
s.load(req);
functiononSoundLoaded(event:
Event):
void
{
varlocalSound:
Sound=event.targetasSound;
localSound.play();
}
首先,该代码范例创建一个新的Sound对象,但没有为其指定URLRequest参数的初始值。
然后,它通过Sound对象侦听Event.COMPLETE事件,该对象导致在加载完所有声音数据后执行onSoundLoaded()方法。
接下来,它使用新的URLRequest值为声音文件调用Sound.load()方法。
在加载完声音后,将执行onSoundLoaded()方法。
Event对象的目标属性是对Sound对象的引用。
如果调用Sound对象的play()方法,则会启动声音回放。
监视声音加载过程
声音文件可能很大,而需要花很长时间进行加载。
尽管FlashPlayer允许应用程序甚至在完全加载声音之前播放声音,但您可能需要向用户指示已加载了多少声音数据以及已播放了多少声音。
Sound类调度以下两个事件,它们可使声音加载进度显示变得相对比较简单:
ProgressEvent.PROGRESS和Event.COMPLETE。
以下示例说明了如何使用这些事件来显示有关所加载的声音的进度信息:
importflash.events.ProgressEvent;
s.addEventListener(ProgressEvent.PROGRESS,onLoadProgress);
s.addEventListener(Event.COMPLETE,onLoadComplete);
s.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
functiononLoadProgress(event:
ProgressEvent):
varloadedPct:
uint=
Math.round(100*(event.bytesLoaded/event.bytesTotal));
trace("
Thesoundis"
+loadedPct+"
%loaded."
functiononLoadComplete(event:
functiononIOError(event:
IOErrorEvent)
Thesoundcouldnotbeloaded:
"
+event.text);
此代码先创建一个Sound对象,然后在该对象中添加侦听器以侦听ProgressEvent.PROGRESS和Event.COMPLETE事件。
在调用Sound.load()方法并从声音文件接收第一批数据后,将会发生ProgressEvent.PROGRESS事件并触发onSoundLoadProgress()方法。
已加载的声音数据百分比等于ProgressEvent对象的bytesLoaded属性值除以bytesTotal属性值。
Sound对象上也提供了相同的bytesLoaded和bytesTotal属性。
以上示例只显示了有关声音加载进度的消息,但您可以方便地使用bytesLoaded和bytesTotal值来更新进度栏组件,例如随AdobeFlex2框架或Flash创作工具提供的组件。
此示例还说明了应用程序在加载声音文件时如何识别并响应出现的错误。
例如,如果找不到具有给定文件名的声音文件,Sound对象将调度一个Event.IO_ERROR事件。
在上面的代码中,当发生错误时,将执行onIOError()方法并显示一条简短的错误消息。
处理嵌入的声音
对于用作应用程序用户界面中的指示器的较小声音(如在单击按钮时播放的声音),使用嵌入的声音非常有用(而不是从外部文件加载声音)。
在应用程序中嵌入声音文件时,生成的SWF文件大小比原来增加了声音文件的大小。
也就是说,如果在应用程序中嵌入较大的声音文件,可能会使SWF文件增大到难以接受的大小。
将声音文件嵌入到应用程序的SWF文件中的具体方法因开发环境而异。
在Flash中使用嵌入的声音文件
Flash创作工具可导入多种声音格式的声音并将其作为元件存储在库中。
然后,您可以将其分配给时间轴上的帧或按钮状态的帧,通过行为来使用声音,或直接在ActionScript代码中使用它们。
本节说明如何在ActionScript代码中通过Flash创作工具来使用嵌入的声音。
有关在Flash中使用嵌入的声音的其它方法,请参阅《使用Flash》中的"
要在Flash影片中嵌入声音文件,请执行以下操作:
1.选择"
文件"
导入"
导入到库"
,然后选择一个声音文件并导入它。
2.在"
库"
面板中,右键单击导入的文件的名称,然后选择"
属性"
单击"
为ActionScript导出"
复选框。
3.在"
类"
字段中,输入一个名称,以便在ActionScript中引用此嵌入的声音时使用。
默认情况下,它将使用此字段中声音文件的名称。
如果文件名包含句点(如名称"
DrumSound.mp3"
),则必须将其更改为类似于"
DrumSound"
这样的名称;
ActionScript不允许在类名称中出现句点字符。
基类"
字段应仍显示flash.media.Sound。
4.单击"
确定"
可能出现一个对话框,指出无法在类路径中找到该类的定义。
以继续。
如果输入的类名称与应用程序的类路径中任何类的名称都不匹配,则会自动生成从flash.media.Sound类继承的新类。
5.要使用嵌入的声音,请在ActionScript中引用该声音的类名称。
例如,通过创建自动生成的DrumSound类的一个新实例来启动以下代码:
6.vardrum:
DrumSound=newDrumSound();
7.varchannel:
SoundChannel=drum.play();
DrumSound是flash.media.Sound类的子类,所以它继承了Sound类的方法和属性,包括上面显示的play()方法。
处理声音流文件
如果在仍加载声音文件或视频文件数据的同时回放该文件,则认为是流式传输。
通常,将对从远程服务器加载的外部声音文件进行流式传输,以使用户不必等待加载完所有声音数据再收听声音。
SoundMixer.bufferTime属性表示FlashPlayer在允许播放声音之前应收集多长时间的声音数据(以毫秒为单位)。
也就是说,如果将bufferTime属性设置为5000,在开始播放声音之前,FlashPlayer将从声音文件中加载至少相当于5000毫秒的数据。
SoundMixer.bufferTime默认值为1000。
通过在加载声音时显式地指定新的bufferTime值,应用程序可以覆盖单个声音的全局SoundMixer.bufferTime值。
要覆盖默认缓冲时间,请先创建一个新的SoundLoaderContext类实例,设置其bufferTime属性,然后将其作为参数传递给Sound.load()方法,如下所示:
importflash.media.SoundLoaderContext;
varcontext:
SoundLoaderContext=newSoundLoaderContext(8000,true);
s.load(req,context);
s.play();
当回放继续进行时,FlashPlayer尝试将声音缓冲保持在相同大小或更大。
如果声音数据的加载速度比回放快,回放将继续进行而不会中断。
但是,如果数据加载速率由于网络限制而减慢,播放头可能会到达声音缓冲区的结尾。
如果发生这种情况,将暂停回放,但会在加载更多声音数据后自动恢复回放。
要查明暂停回放是否是由于FlashPlayer正在等待加载数据,请使用Sound.isBuffering属性。
播放声音
播放加载的声音非常简便,您只需为Sound对象调用Sound.play()方法,如下所示:
varsnd:
Sound=newSound(newURLRequest("
smallSound.mp3"
));
snd.play();
使用ActionScript3.0回放声音时,您可以执行以下操作:
∙从特定起始位置播放声音
∙暂停声音并稍后从相同位置恢复回放
∙准确了解何时播放完声音
∙跟踪声音的回放进度
∙在播放声音的同时更改音量或声相
要在回放期间执行这些操作,请使用SoundChannel、SoundMixer和SoundTransform类。
SoundChannel类控制一种声音的回放。
可以将SoundChannel.position属性视为播放头,以指示所播放的声音数据中的当前位置。
当应用程序调用Sound.play()方法时,将创建一个新的SoundChannel类实例来控制回放。
通过将特定起始位置(以毫秒为单位)作为Sound.play()方法的startTime参数进行传递,应用程序可以从该位置播放声音。
它也可以通过在Sound.play()方法的loops参数中传递一个数值,指定快速且连续地将声音重复播放固定的次数。
使用startTime参数和loops参数调用Sound.play()方法时,每次将从相同的起始点重复回放声音,如以下代码中所示:
repeatingSound.mp3"
snd.play(1000,3);
在此示例中,从声音开始后的1秒起连续播放声音三次。
暂停和恢复播放声音
如果应用程序播放很长的声音(如歌曲或播客),您可能需要让用户暂停和恢复回放这些声音。
实际上,无法在ActionScript中的回放期间暂停声音;
而只能将其停止。
但是,可以从任何位置开始播放声音。
您可以记录声音停止时的位置,并随后从该位置开始重放声音。
例如,假定代码加载并播放一个声音文件,如下所示:
varchannel:
SoundChannel=snd.play();
在播放声音的同时,SoundChannel.position