




免费预览已结束,剩余26页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ActionScript3.0编程入门与提高声音篇第 20 章处理声音2 0ActionScript 是为开发引人入胜的交互式应用程序而设计的,这种极其引人入胜的应用程序中经常被忽略的一个元素是声音。您可以在视频游戏中添加声音效果,在应用程序用户界面中添加音 频回馈,甚至创 建一个分析通 过 Internet 加载的 mp3 文件的程序 (在这些情况下,声音是应用程序的核心)。在本章中,您将了解如何加载外部音频文件以及处理 SWF 中嵌入的音频。您还会了解如何控制音频、创建声音信息的可视表示形式以及从用户麦克风捕获声音。目录声音处理基础知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514了解声音体系结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516加载外部声音文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517处理嵌入的声音 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520处理声音流文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521播放声音 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521加载和播放声音时的安全注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .525控制音量和声相 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .526处理声音元数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527访问原始声音数据 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .528捕获声音输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .532示例:Podcast Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .535513声音处理基础知识处理声音简介就像计算机可以采用数字格式对图像进行编码、将它们存储在计算机上以及检索它们以便在屏幕上显示它们一样,计算机可以捕获并编码数字音频 (声音信息的计算机表示形式)以及对其进行存储和检索,以通过连接到计算机上的扬声器进行回放。一种回放声音的方法是使用 Adobe Flash Player 和 ActionScript。将声音数据转换为数字形式后,它具有各种不同的特性,如声音的音量以及它是立体声还是单声道声音。在 ActionScript 中回放声音时,您也可以调整这些特性;例如,使声音变得更大,或者使其像是来自某个方向。在 ActionScript 中控制声音之前,您需要先将声音信息加载到 Flash Player 中。可以使用四种方法将音频数据加载到 Flash Player 中,以便通过 ActionScript 对其进行使用。您可以将外部声音文件 (如 mp3 文件)加载到 SWF 中;在创建 SWF 文件时将声音信息直接嵌入到其中;使用连接到用户计算机上的麦克风来获取音频输入,以及访问从服务器流式传输的声音数据。 从外部声音文件加载声音数据时,您可以在仍加载其余声音数据的同时开始回放声音文件的开头部分。 虽然 可 以使 用各 种不 同 的声 音文 件格 式对 数 字音 频进 行编 码,但是 ActionScript 3.0 和Flash Player 支持以 mp3 格式存储的声音文件。它们不能直接加载或播放其它格式的声音文件,如 WAV 或 AIFF。在 ActionScript 中处理声音时,您可能会使用 flash.media 包中的某些类。通过使用 Sound类,您可 以加 载声音 文件 并开始 回放 以获取 对音 频信息 的访 问。开始播 放声 音后, FlashPlayer 可为您提供对 SoundChannel 对象的访问。由于已加载的音频文件只 能是您在用户计 算 机 上 播 放 的 几 种 声 音 之 一,因 此,所 播 放 的 每 种 单 独 的 声 音 使 用 其 自 己 的SoundChannel 对象;混合在一起的所有 SoundChannel 对象的组合输出是实际通过计算机扬声器播放的声音。可以使用此 SoundChannel 实例来控制声音的属性以及将其停止回放。最后,如果要控制组合音频,您可以通过 SoundMixer 类对混合输出进行控制。 也可以使用几个其它类,在 ActionScript 中处理声音时执行更具体的任务;要了解与声音有关的所有类的详细信息,请参阅第 516 页的 “了解声音体系结构”。514处理声音常见的声音处理任务本章介绍了以下您将希望执行的与声音有关的任务: 加载外部 mp3 文件并跟踪其加载进度 播放、暂停、继续播放以及停止播放声音 在加载的同时播放声音流 控制音量和声相 从 mp3 文件中检索 ID3 元数据 使用原始声音波形数据 从用户麦克风捕获并重新播放声音输入重要概念和术语以下参考列表包含您将会在本章中遇到的重要术语: 波幅 (Amplitude):声音波形上的点与零或平衡线之间的距离。 比特率 (Bit rate):每秒为声音文件编码或流式传输的数据量。对于 mp3 文件,比特率通常是以每秒千位数 (kbps) 来表述的。较高的比特率通常意味着较高品质的声音波形。 缓冲 (Buffering):在回放之前接收和存储声音数据。 mp3:MPEG-1 Audio Layer 3 (mp3) 是一种常用的声音压缩格式。 声相 (Panning):将音频信号放在立体声声场中左声道和右声道之间。 峰值 (Peak):波形中的最高点。 采样率 (Sampling rate):定义在生成数字信号时每秒从模拟音频信号采集的样本数。标准光盘音频的采样率为 44.1 kHz 或每秒 44,100 个样本。 流式传输 (Streaming):此过程是指,在仍从服务器加载声音文件或视频文件的后面部分的同时播放该文件的前面部分。 音量 (Volume):声音的响度。 波形 (Waveform):声音信号波幅随时间变化的图形形状。完成本章中的示例学习本章的过程中,您可能希望测试某些示例代码清单。由于本章介绍了在 ActionScript 中处理声音,因此许多示例都涉及对声音文件的处理,例如,播放声音文件、停止回放或以某种方式调整声音。测试本章中的示例:1. 创建一个新的 Flash 文档并将它保存到您的计算机上。2. 在时间轴上,选择第一个关键帧,然后打开 “动作”面板。3. 将示例代码清单复制到 “脚本”窗格中。声音处理基础知识5154.5.如果代码涉及加载外部声音文件,则其中会有一行与下面的代码类似的代码:var req:URLRequest = new URLRequest(click.mp3);var s:Sound = new Sound(req);其中 “click.mp3”是要加载的声音文件的名称。为了测试这些示例,需要有一个可使用的 mp3 文件。应将此 mp3 文件放入 Flash 文档所在的文件夹中。然后应更改代码以使用 mp3 文件的名称,而不是代码清单中的名称(例如,在上面的代码中,将“click.mp3”改为 mp3 文件的名称)。从主菜单中,选择 “控制” “测试影片”以创建 SWF 文件并预览 (并且听一下)示例的输出。除了播放音频外,某些示例将使用 trace() 函数来显示值;当测试这些示例时,将会在“输出”面板中看到这些值的结果。一些示例还将内容绘制到屏幕上,因此对于这些示例,您还将在 Flash Player 窗口中看到内容。有关测试本手册中的示例代码清单的详细信息,请参阅第 53 页的 “测试本章内的示例代码清单”。了解声音体系结构应用程序可以从以下四种主要来源加载声音数据: 在运行时加载的外部声音文件 在应用程序的 SWF 文件中嵌入的声音资源 来自连接到用户系统上的麦克风的声音数据 从远程媒体服务器流式传输的声音数据,如 Flash Media Server可以在回放之前完全加载声音数据,也可以进行流式传输,即在仍进行加载的同时回放这些数据。ActionScript 3.0 和 Flash Player 支持以 mp3 格式存储的声音文件。它们不能直接加载或播放其它格式的声音文件,如 WAV 或 AIFF。 使用 Adobe Flash CS3 Professional,可以导入 WAV 或 AIFF 声音文件,然后将其以 mp3格式嵌入应用程序的 SWF 文件中。 Flash 创作工具还可压缩嵌入的声音文件以减小文件大小,但会降低声音的品质。有关详细信息,请参阅 使用 Flash中的 “导入声音”。516处理声音ActionScript 3.0 声音体系结构使用 flash.media 包中的以下类。类 描述flash.media.Sound Sound 类处理 声音加 载、管理基本声音属性以及启动声音播放。flash.media.SoundChannel 当应用程序播放 Sound 对象时,将创建一个新的 SoundChannel 对象来控制回放。 SoundChannel 对象控制声音的左和右回放声道的音量。播放的每种声音具有其自己的 SoundChannel 对象。flash.media.SoundLoaderContext SoundLoad erContext 类指定在加载声音时使用的缓冲秒数,以及 Flash Player 在加载文件时是否 从服务 器中查找跨域策略文件。 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 类不能用于从麦克风或流媒体服务器 (如 FlashMedia Server)中获取的声音数据。加载外部声音文件Sound 类的每个实例可加载并触发特定声音资源的回放。应用程序无法重复使用 Sound 对象来加载多种声音。如果它要加载新的声音资源,则应创建一个新的 Sound 对象。如果要加载较小的声音文件 (如要附加到按钮上的单击声音),应用程序可以创建一个新的Sound,并让其自动加载该声音文件,如下所示:var req:URLRequest = new URLRequest(click.mp3);var s:Sound = new Sound(req);加载外部声音文件517Sound() 构造函数接受一个 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 .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):voidvar localSound:Sound = event.target as Sound;localSound.play();首先,该代 码范例创 建一个 新的 Sound 对象,但没 有为其 指定 URLRequest 参数 的初始值。然后,它通过 Sound 对象侦听 Event.COMPLETE 事件,该对象导致在加载完所有声音数据后执行 onSoundLoaded() 方法。接下来,它使用新的 URLRequest 值为声音文件调用Sound.load() 方法。在加载完声音后,将执行 onSoundLoaded() 方法。 Event 对象的目标属性是对 Sound 对象的引用。如果调用 Sound 对象的 play() 方法,则会启动声音回放。518处理声音监视声音加载过程声音文件可能很大,而需要花很长时间进行加载。尽管 Flash Player 允许应用程序甚至在完全加载声音之前播放声音,但您可能需要向用户指示已加载了多少声音数据以及已播放了多少声音。Sound 类调度以下两个事件,它们可使声音加载进度显示变得相对比较简单:ProgressEvent.PROGRESS 和 Event.COMPLETE。以下示例说明了如何使用这些事件来显示有关所加载的声音的进度信息:import flash.events.Event;import flash.events.ProgressEvent;import flash.media.Sound;import .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):voidvar loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal);trace(The sound is + loadedPct + % loaded.);function onLoadComplete(event:Event):voidvar 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 2 框架或 Flash 创作工具提供的组件。加载外部声音文件519此示例还说明了应用程序在加载声音文件时如何识别并响应出现的错误。例如,如果找不到具有给定文件名的声音文件,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 类的一个新实例来启动以下代码:var drum:DrumSound = new DrumSound();var channel:SoundChannel = drum.play();DrumSound 是 flash.media.Sound 类的子类,所以它继承了 Sound 类的方法和属性,包括上面显示的 play() 方法。520处理声音处理声音流文件如果在仍加载声音文件或视频文件数据的同时回放该文件,则认为是流式传输。通常,将对从远程服务器加载的外部声音文件进行流式传输,以使用户不必等待加载完所有声音数据再收听声音。SoundMixer.bufferTime 属性表示 Flash Player 在允许播放声音之前应收集多长时间的声音数据 (以毫秒为单位)。也就是说,如果将 bufferTime 属性设置为 5000,在开始播放声音之前, Flash Player 将从声音文件中加载至少相当于 5000 毫秒的数据。SoundMixer.bufferTime 默认值为 1000。通过在加载声音时显式地指定新的 bufferTime 值,应用程序可以覆盖单个声音的全局 SoundMixer.bufferTime 值。要覆盖默认缓冲时间,请先创建一个新的 SoundLoaderContext 类实例,设置其 bufferTime 属性,然后将其作为参数传递给 Sound.load() 方法,如下所示:import flash.media.Sound;import flash.media.SoundLoaderContext;import .URLRequest;var s:Sound = new Sound();var req:URLRequest = new URLRequest(bigSound.mp3);var context:SoundLoaderContext = new SoundLoaderContext(8000, true);s.load(req, context);s.play();当回放继续进行时, Flash Player 尝试将声音缓冲保持在相同大小或更大。如果声音数据的加载速度比回放快,回放将继续进行而不会中断。但是,如果数据加载速率由于网络限制而减慢,播放头可能会到达声音缓冲区的结尾。如果发生这种情况,将暂停回放,但会在加载更多声音数据后自动恢复回放。要查明 暂停回放 是否是由 于 Flash Player 正在等待 加载数据,请使 用 Sound.isBuffering属性。播放声音播放加载的声音非常简便,您只需为 Sound 对象调用 Sound.play() 方法,如下所示:var snd:Sound = new Sound(new URLRequest(smallSound.mp3);snd.play();使用 ActionScript 3.0 回放声音时,您可以执行以下操作: 从特定起始位置播放声音 暂停声音并稍后从相同位置恢复回放 准确了解何时播放完声音播放声音521跟踪声音的回放进度在播放声音的同时更改音量或声相要在回放期间执行这些操作,请使用 SoundChannel、SoundMixer 和 SoundTransform 类。SoundChannel 类控制一种声音的回放。可以将 SoundChannel.position 属性视为播放头,以指示所播放的声音数据中的当前位置。 当应用程序调用 Sound.play() 方法时,将创建一个新的 SoundChannel 类实例来控制回放。 通过将特定起始位置 (以毫秒为单位)作为 Sound.play() 方 法的 startTime 参数进行传递,应用程序可以从该位置播放声音。它也可以通过在 Sound.play() 方法的 loops 参数中传递一个数值,指定快速且连续地将声音重复播放固定的次数。 使用 startTime 参数和 loops 参数调用 Sound.play() 方法时,每次将从相同的起始点重复回放声音,如以下代码中所示:var snd:Sound = new Sound(new URLRequest(repeatingSound.mp3);snd.play(1000, 3);在此示例中,从声音开始后的 1 秒起连续播放声音三次。暂停和恢复播放声音如果应用程序播放很长的声音 (如歌曲或播客),您可能需要让用户暂停和恢复回放这些声音。实际上,无法在 ActionScript 中的回放期间暂停声音;而只能将其停止。但是,可以从任何位置开始播放声音。您可以记录声音停止时的位置,并随后从该位置开始重放声音。例如,假定代码加载并播放一个声音文件,如下所示:var snd:Sound = new Sound(new URLRequest(bigSound.mp3);var channel:SoundChannel = snd.play();在播放声音的同时,SoundChannel.position 属性指示当前播放到的声音文件位置。应用程序可以在停止播放声音之前存储位置值,如下所示:var pausePosition:int = channel.position;channel.stop();要恢复播放声音,请传递以前存储的位置值,以便从声音以前停止的相同位置重新启动声音。channel = snd.play(pausePosition);522处理声音监视回放应用程序可能需要了解何时停止播放某种声音,以便开始播放另一种声音,或者清除在以前回放期间使用的某些资源。 SoundChannel 类在其声音完成播放时将调度 Event.SOUND_COMPLETE 事件。应用程序可以侦听此事件并执行相应的动作,如下所示:import flash.events.Event;import flash.media.Sound;import .URLRequest;var snd:Sound = new Sound(smallSound.mp3);var channel:SoundChannel = snd.play();s.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);public function onPlaybackComplete(event:Event)trace(“The sound has finished playing.”);SoundChannel 类在回放期间不调度进度事件。要报告回放进度,应用程序可以设置其自己的计时机制并跟踪声音播放头的位置。要计算已播放的声音百分比,您可以将 SoundChannel.position 属性值除以所播放的声音数据长度:var playbackPercent:uint = 100 * (channel.position / snd.length);但 是,仅当 在 开始 回放 之 前完 全 加载 了声 音 数据,此 代 码才 会 报告 精确 的 回放 百 分比。Sound.length 属性显示当前加载的声音数据的大小,而不是整个声音文件的最终大小。要跟踪仍在加载的声音流的回放进度,应用程序应估计完整声音文件的最终大小,并在其计算中使用该值。您可以使用 Sound 对象的 bytesLoaded 和 bytesTotal 属性来估计声音数据的最终长度,如下所示:var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal);var playbackPercent:uint = 100 * (channel.position / estimatedLength);以下代码加载一个较大的声音文件,并使用 Event.ENTER_FRAME 事件作为其计时机制来显示回放进度。它定期报告回放百分比,这是作为当前位置值除以声音数据的总长度来计算的:import flash.events.Event;import flash.media.Sound;import .URLRequest;var snd:Sound = new Sound();var req:URLRequest = new URLRequest(/podcast/csbu_dev_podcast_epi_2.mp3);snd.load(req);var channel:SoundChannel;channel = snd.play();播放声音523addEventListener(Event.ENTER_FRAME, onEnterFrame);snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);function onEnterFrame(event:Event):voidvar estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal);var playbackPercent:uint = Math.round(100 * (channel.position / estimatedLength);trace(Sound playback is + playbackPercent + % complete.);function onPlaybackComplete(event:Event)trace(The sound has finished playing.);removeEventListener(Event.ENTER_FRAME, onEnterFrame);在开始加载声音数据后,此代码调用 snd.play() 方法,并将生成的 SoundChannel 对象存储在 channel 变量中。随后,此代码在主应用程 序中添加 Event.ENTER_FRAME 事件的事件侦听器,并在 SoundChannel 对象中添加另一个事件侦听器,用于侦听在回放完成时发生的 Event.SOUND_COMPLETE 事件。每次应用程序到达其 动画中的新帧时,将调用 onEnterFrame() 方法。 onEnterFrame() 方法基于已加载的数据量来估计声音文件的总长度,然后计算并显示当前回放百分比。当播放整个声音后,将执行 onPlaybackComplete() 方法来删除 Event.ENTER_FRAME 事件的事件侦听器,以使其在完成回放后不会尝试显示进度更新。可以每秒多次调度 Event.ENTER_FRAME 事件。在某些情况下,您不需要频繁显示回放进度。在这些情况下,应用程序可以使用 flash.util.Timer 类来设置其自己的计时机制;请参阅第 159 页的 “处理日期和时间”。停止声音流在进行流式传输的声音 (即,在播放的同时仍在加载声音)的回放过程中,有一个奇怪的现象。当应用程序对回放声音流的 SoundChannel 实例调用 SoundChannel.stop() 方法时,声音回放在一个帧处停止,随后在下一帧处从声音开头重新回放。发生这种情况是因为,声音加载过程仍在进行当中。要停止声音流加载和回放,请调用 Sound.close() 方法。524处理声音加载和播放声音时的安全注意事项可以根据 Flash Player 安全模型来限制应用程序访问声音数据的功能。每种声音受两种不同的安全沙箱的限制:内容本身的沙箱 (“内容沙箱”)以及加载和播放声音的应用程序或对象的沙箱 (“所有者沙箱”)。要了解有关常用 Flash Player 安全模型的详细信息以及沙箱定义,请参阅第 649 页的 “Flash Player 安全性”。内容沙箱控制使用 id3 属性还是 SoundMputeSpectrum() 方法从声音提取详细声音数据。它不会限制声音文件本身的加载或播放。声音文件的原始域定义了内容沙箱的安全限制。一般来说,如果某个声音文件与加载该文件的应用程序或对象的 SWF 文件位于相同的域或文件夹中,则应用程序或对象具有该声音文件的完全访问权限。如果声音来自与应用程序不同的域,仍可以使用跨域策略文件将其加载到内容沙箱中。 应用程序可以将带有 checkPolicyFile 属性的 SoundLoaderContext 对象作为参数传递给Sound.load() 方法。如果将 checkPolicyFile 属性设置为 true,则会通知 Flash Player 在从中加载声音的服务器上查找跨域策略文件。如果存在跨域策略文件,并且它为执行加载的SWF 文件所在的域授予了访问权限,则该 SWF 文件可以加载声音文件、访问 Sound 对象的 id3 属性以及为加载的声音调用 SoundMputeSpectrum() 方法。所有者沙箱控制声音的本地回放。所有者沙箱是由开始播放声音的应用程序或对象定义的。 只要当前播放的所有 SoundChannel 对象中的声音符合以下条件,SoundMixer.stopAll()方法就会将它们静音: 声音是由相同所有者沙箱中的对象启动的。 声音来自具有跨域策略文件 (为调用 SoundMixer.stopAll() 方法的应用程序或对象所在的域授予访问权限)的源。要查 明 SoundMixer.stopAll() 方 法是否确 实停止 了所有 播放的 声音,应用程 序可以 调用SoundMixer.areSoundsInaccessible() 方法。如果 该方法返回 值 true,则当前所 有者沙箱无法控制播放的某些声音, SoundMixer.stopAll() 方法不会将其停止。SoundMixer.stopAll() 方法还会阻止播放头继续播放从外部文件加载的所有声音。但是,如果动画移动到一个新帧, FLA 文件中嵌入的声音以及使用 Flash 创作工具附加到时间轴中的帧上的声音可能会重新开始播放。 加载和播放声音时的安全注意事项525控制音量和声相单个 SoundChannel 对象 控制声 音的左 和右立体 声声道。如 果 mp3 声音 是单声 道声音,SoundChannel 对象的左和右立体声声道将包含完全相同的波形。可通过使用 SoundChannel 对象的 leftPeak 和 rightPeak 属性来查明所播放的声音的每个立体 声声道 的波幅。这些 属性显示 声音波形 本身的 峰值波幅。它 们并不表 示实际回 放音量。实际回放音量是声音波形的波幅以及 SoundChannel 对象和 SoundMixer 类中设置的音量值的函数。在回放期间,可以使用 SoundChannel 对象的 pan 属性为左和右声道分别指定不同的音量级别。 pan 属性可以具有范围从 -1 到 1 的值,其中, -1 表示左声道以最大音量播放,而右声道处于静音状态; 1 表示右声道以最大音量播放,而左声道处于静音状态。介于 -1 和 1 之间的数值为左和右声道值设置一定比例的值,值 0 表示两个声道以均衡的中音量级别播放。以下代码示例使用 volume 值 0.6 和 pan 值 -1 创建一个 SoundTransform 对象 (左声道为最高音量,右声道没有音量) 。此代码将 SoundTransform 对象作为参数传递给 play() 方法,此方法将该 SoundTransform 对象应用于为控制回放而创建的新 SoundChannel 对象。var snd:Sound = new Sound(new URLRequest(bigSound.mp3); var trans:SoundTransform = new SoundTransform(0.6, -1);var channel:SoundChannel = snd.play(0, 1, trans);可以在播放声音的同时更改音量和声相,方法是:设置 SoundTransform 对象的 pan 或volume 属性,然后将该对象作为 SoundChannel 对象的 soundTransform 属性进行应用。也可以通过使用 SoundMixer 类的 soundTransform 属性,同时为所有声音设置全局音量和声相值,如以下示例所示:SoundMixer.soundTransform = new SoundTransform(1, -1);也可以使用 SoundTransform 对象为 Microphone 对象 (请参阅第 532 页的 “捕获声音输入”)、 Sprite 对象和 SimpleButton 对象设置音量和声相值。以下示 例在播放 声音的同 时将声音 从左声道 移到右声道 ,然后再移 回来,并 交替进行 这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论