Sound类在flash.media包中,flash.media包中的内容包括:
| 类 | 说明 | 
| Microphone | Microphone 类可以连接到麦克风并捕获音频 | 
| Camera | Camera 类可以连接到摄像头并捕获视频 | 
| Video | Video 类在应用程序中显示实时视频或录制视频 | 
| Sound | Sound 类允许在应用程序中使用声音 | 
| ID3Info | ID3Info 类包含反映 ID3 元数据的属性 | 
| SoundLoaderContext | SoundLoaderContext 类为加载声音的 SWF 文件提供安全检查 | 
| SoundChannel | SoundChannel 类控制应用程序中的声音 | 
| SoundTransform | SoundTransform类包含控制音量和平移的属性 | 
| SoundMixer | SoundMixer 类包含 SWF 文件中全局声音控件的静态属性和方法 | 
关于Sound的有关类,以及它们的关系如下表所示:
| ID3Info | SoundTransform | SoundTransform | 
| Sound类 | SoundChannel | SoundMixer | 
| SoundLoaderContext | 
中间行的Sound、SoundChannel和SoundMixer是ActionScript3.0中关于声音的关键类。即加载控制、播放控制和变换控制。
一、Sound相关类
1. Sound类
使用 Sound 类可以创建 Sound 对象、将外部 MP3 文件加载到该对象并播放该文件、关闭声音流,以及访问声音流中的字节数和 ID3 元数据。
| 属性 | 
| bytesLoaded : uint[只读] 返回声音对象中当前可用的字节数 | 
| bytesTotal : int[只读] 返回声音对象中总的字节数 | 
| id3 : ID3Info[只读] 提供对作为 MP3 文件一部分的元数据的访问 | 
| isBuffering : Boolean[只读] 返回外部 MP3 文件的缓冲状态 | 
| length : Number[只读] 当前声音的长度(以毫秒为单位) | 
| url : String[只读] 从中加载此声音的 URL | 
Sound类中的方法:
| 方法 | 
| Sound(stream:URLRequest = null, context:SoundLoaderContext = null)创建一个新的 Sound 对象 | 
| addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知 | 
| close():void关闭该流,从而停止所有数据的下载 | 
| extract(target:ByteArray, length:Number, startPosition:Number = -1):Number从 Sound 对象提取原始声音数据 | 
| load(stream:URLRequest, context:SoundLoaderContext = null):void启动从指定 URL 加载外部 MP3 文件的过程 | 
| play(startTime:Number = 0, loops:int = 0, sndTransform:SoundTransform = null):SoundChannel生成一个新的 SoundChannel 对象来回放该声音 | 
Sound的事件:
| 事件 | 摘要 | 
| complete | 成功加载数据后调度 | 
| Id3 | 当存在 ID3 数据时由 Sound 对象调度 | 
| ioError | 在出现输入/输出错误并由此导致加载操作失败时调度 | 
| open | 在加载操作开始时调度 | 
| progress | 在加载操作进行过程中接收到数据时调度 | 
| sampleData | 当播放器请求新的音频数据时调度 | 
2. ID3Info
ID3Info 类包含反映 ID3 元数据的属性。 可以通过访问 Sound 类的 id3 属性来获取 MP3 文件的其它元数据;例如,mySound.id3.TIME
| album : String专辑的名称;对应于 ID3 2.0 标签 TALB | 
| artist : String歌手的姓名;对应于 ID3 2.0 标签 TPE1 | 
| comment : String录制的相关注解;对应于 ID3 2.0 标签 COMM | 
| genre : String歌曲的流派;对应于 ID3 2.0 标签 TCON | 
| songName : String歌曲的名称;对应于 ID3 2.0 标签 TIT2 | 
| track : String曲目编号;对应于 ID3 2.0 标签 TRCK | 
| year : String录制的年份;对应于 ID3 2.0 标签 TYER | 
3. SoundLoaderContext 类
SoundLoaderContext 类为加载声音的 SWF 文件提供安全检查。 SoundLoaderContext 对象以参数的形式传递到构造函数和 Sound 类的 load() 方法
使用此类时,请考虑 Flash Player 安全模型:
- 如果执行调用的 SWF 文件在网络沙箱中,并且要加载的声音文件是本地文件,则不允许加载和播放声音
- 默认情况下,若执行调用的 SWF 是本地的,并且试图加载和播放远程声音,则不允许加载和播放声音。 用户必须授予明确许可以允许该操作
- 某些处理声音的操作受到限制。 除非实现一个 URL 策略文件,否则位于其他域中的 SWF 文件无法访问已加载声音中的数据。受此限制约束的与声音相关的 API 为 Sound.id3 属性以及 SoundMixer.computeSpectrum()、SoundMixer.bufferTime 和 SoundTransform() 方法
SoundLoaderContext 类的属性和方法:
| 属性 | 
| bufferTime : Number = 1000在开始传输声音流之前将其预加载到缓冲区中所用的毫秒数 | 
| checkPolicyFile : Boolean = false指定 Flash Player 是否应在开始加载声音之前尝试从所加载声音的服务器下载 URL 策略文件 | 
| 方法 | 
| SoundLoaderContext(bufferTime:Number = 1000, checkPolicyFile:Boolean = false)创建新的声音加载器上下文对象。 | 
二、SoundChannel
SoundChannel 类控制应用程序中的声音。 Flash 应用程序中播放的每一个声音都被分配到一个声道,而且应用程序可以具有混合在一起的多个声道。 SoundChannel 类包含 stop() 方法、用于监控声道幅度(音量)的属性,以及用于对声道设置 SoundTransform 对象的属性。
| 属性 | 
| leftPeak : Number[只读] 左声道的当前幅度(音量),范围从 0(静音)至 1(最大幅度) | 
| rightPeak : Number[只读] 右声道的当前幅度(音量),范围从 0(静音)至 1(最大幅度) | 
| position : Number[只读] 当播放声音时,position 属性指示声音文件中当前播放的位置 | 
| soundTransform : SoundTransform分配给该声道的 SoundTransform 对象 | 
| 方法 | 
| stop():void停止在该声道中播放声音 | 
| 事件 | 事件摘要 | 
| soundComplete | 在声音完成播放后调度 | 
三、SoundMixer相关的类
1. SoundTransform类
SoundTransform 类包含控制音量和平移的属性。以下对象包含 soundTransform 属性:Microphone、NetStream、SimpleButton、SoundChannel、SoundMixer 和 Sprite。
SoundTransform(vol:Number = 1, panning:Number = 0)
| leftToLeft : Number从 0(无)至 1(全部)的值,指定了左输入在左扬声器里播放的量 | 
| leftToRight : Number从 0(无)至 1(全部)的值,指定了左输入在右扬声器里播放的量 | 
| pan : Number声音从左到右的平移,范围从 -1(左侧最大平移)至 1(右侧最大平移) | 
| rightToLeft : Number从 0(无)至 1(全部)的值,指定了右输入在左扬声器里播放的量 | 
| rightToRight : Number从 0(无)至 1(全部)的值,指定了右输入在右扬声器里播放的量 | 
| volume : Number音量范围从 0(静音)至 1(最大音量) | 
2. SoundMixer
SoundMixer 类包含 SWF 文件中全局声音控件的静态属性和方法。 SoundMixer 类控制SWF中嵌入的声音流;它并不控制动态创建的Sound对象。
| 属性 | 
| bufferTime : int[静态] 在开始传输嵌入的声音流之前,将其预加载到缓冲区中所用的秒数 | 
| soundTransform : SoundTransform[静态] 控制全局声音属性的 SoundTransform 对象。 | 
| 方法 | 
| areSoundsInaccessible():Boolean[静态] 确定是否因安全限制而无法访问任何声音 | 
| computeSpectrum(outputArray:ByteArray, FFTMode:Boolean = false, stretchFactor:int = 0):void[静态] 获取当前声音波形的快照,并将其放在指定的 ByteArray 对象中 | 
| stopAll():void[静态] 停止当前正在播放的所有声音 | 
3. computeSpectrum () 方法
public static function computeSpectrum(outputArray:ByteArray, FFTMode:Boolean = false, stretchFactor:int = 0):void
- ByteArray 为标准浮点值(范围为 -1.0 到 1.0)格式。创建的 ByteArray 对象的大小固定为 512 个浮点值,其中前 256 个值表示左声道,后 256 个值表示右声道
- outputArray:ByteArray — 用于保存与声音关联的 ByteArray 对象 FFTMode:Boolean (default = false) — 指示是否对声音数据执行傅立叶变换的布尔值。将此参数设置为 true 会导致方法返回的是频谱而不是原始声音波形。在频谱中,左侧表示的是低频,右侧表示的是高频
- stretchFactor:int (default = 0) — 声音采样的分辨率。 如果将 stretchFactor 值设置为 0,则会按 44.1 KHz 对数据进行采样;如果值为 1,则按 22.05 KHz 对数据进行采样;依此类推
声音频谱的实现效果如下:
四、Sound类的使用
整体的实现逻辑如下图所示:
通过Sound类监听声音文件的加载,当加载完毕实现播放,监测播放的进度,从而实现循环播放或播放列表控制。
package{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.net.URLRequest;
	public class LoopOne extends Sprite{
		private var sound:Sound;
		private var channel:SoundChannel;
		public function LoopOne(){
			sound = new Sound();
			sound.load(new URLRequest("assets/song1.mp3"));
			sound.addEventListener(Event.COMPLETE,onStart);
		}
		private function onStart(e:Event):void{
			channel = sound.play();
			channel.addEventListener(Event.SOUND_COMPLETE,onStart);
		}
	}
}
附件中包括一些示例,示例的内容如下所示:
播放及单曲循环:LoopOne.as
播放多个音乐:LoopMulti.as
播放暂停:PlayPause.as
上一首和下一首:BackForward.as
音量控制:ChangleVolume.as
音乐频谱:EQGraph.as
音乐进度:SoundProgressBar.as
转载请注明:陈童的博客 » ActionScript3.0中的Sound类






