| window.runtime 属性 | window.runtime.flash.media.Sound |
| 继承 | Sound EventDispatcher Object |
| 运行时版本: | 1.0 |
在 Flash Player 10 及更高版本和 AIR 1.5 及更高版本中,也可以使用此类来处理动态生成的声音。在这种情况下,Sound 对象将使用向 sampleData 事件处理函数分配的函数来轮询声音数据。从用声音数据填充的 ByteArray 对象检索声音的同时播放声音。可以使用 Sound.extract() 从 Sound 对象中提取声音数据,然后在将声音数据写回到流以进行播放之前可以对其进行操作。
若要控制嵌入到 SWF 文件的声音,请使用 SoundMixer 类中的属性。
在使用此类时,请考虑以下安全模型:
Sound.id3、SoundMixer.computeSpectrum()、SoundMixer.bufferTime 和 SoundTransform 类。但在 Adobe AIR 中,application 安全沙箱中的内容(使用 AIR 应用程序安装的内容)不受这些安全限制的约束。
有关安全性的详细信息,请参阅以下部分:
另请参见
| 属性 | 定义方 | ||
|---|---|---|---|
| bytesLoaded : uint [只读 (read-only)]
返回此声音对象中当前可用的字节数。 | Sound | ||
| bytesTotal : int [只读 (read-only)]
返回此声音对象中总的字节数。 | Sound | ||
![]() | constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | |
| id3 : ID3Info [只读 (read-only)]
提供对作为 MP3 文件一部分的元数据的访问。 | Sound | ||
| isBuffering : Boolean [只读 (read-only)]
返回外部 MP3 文件的缓冲状态。 | Sound | ||
| length : Number [只读 (read-only)]
当前声音的长度(以毫秒为单位)。 | Sound | ||
![]() | prototype : Object [静态]
对类或函数对象的原型对象的引用。 | Object | |
| url : String [只读 (read-only)]
从中加载此声音的 URL。 | Sound | ||
| 方法 | 定义方 | ||
|---|---|---|---|
创建一个新的 Sound 对象。 | Sound | ||
![]() | addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | |
close():void
关闭该流,从而停止所有数据的下载。 | Sound | ||
![]() |
将事件调度到事件流中。 | EventDispatcher | |
从 Sound 对象提取原始声音数据。 | Sound | ||
![]() |
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | |
![]() |
指示对象是否已经定义了指定的属性。 | Object | |
![]() |
指示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | |
启动从指定 URL 加载外部 MP3 文件的过程。 | Sound | ||
生成一个新的 SoundChannel 对象来回放该声音。 | Sound | ||
![]() |
指示指定的属性是否存在、是否可枚举。 | Object | |
![]() |
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | |
![]() |
设置循环操作动态属性的可用性。 | Object | |
![]() | toString():String
返回指定对象的字符串表示形式。 | Object | |
![]() | valueOf():Object
返回指定对象的原始值。 | Object | |
![]() |
检查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。 | EventDispatcher | |
| 事件 | 摘要 | 定义方 | ||
|---|---|---|---|---|
![]() | [广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | ||
| 成功加载数据后调度。 | Sound | |||
![]() | [广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher | ||
| 在存在可用于 MP3 声音的 ID3 数据时由 Sound 对象调度。 | Sound | |||
| 在出现输入/输出错误并由此导致加载操作失败时调度。 | Sound | |||
| 在加载操作开始时调度。 | Sound | |||
| 在加载操作进行过程中接收到数据时调度。 | Sound | |||
| 当播放器请求新的音频数据时调度。 | Sound | |||
| bytesLoaded | 属性 |
| bytesTotal | 属性 |
| id3 | 属性 |
id3:ID3Info [只读 (read-only)] | 运行时版本: | 1.0 |
提供对作为 MP3 文件一部分的元数据的访问。
MP3 声音文件可以包含 ID3 标签,ID3 标签提供有关该文件的元数据。如果使用 Sound.load() 方法加载的 MP3 声音包含 ID3 标签,则可以查询这些属性。只支持使用 UTF-8 字符集的 ID3 标签。
AIR 运行时支持 ID3 2.0 标签,特别是 2.3 和 2.4。以下各表列出了标准 ID3 2.0 标签以及这些标签所表示内容的类型。Sound.id3 属性通过 my_sound.id3.COMM 和 my_sound.id3.TIME 等格式提供对这些标记的访问权限。 第一个表描述了可通过 ID3 2.0 属性名称或 ActionScript 属性名称进行访问的标签。 第二个表描述了在 ActionScript 中受支持但不具有预定义属性的 ID3 标签。
| ID3 2.0 标签 | 相应的 Sound 类属性 |
| COMM | Sound.id3.comment |
| TALB | Sound.id3.album |
| TCON | Sound.id3.genre |
| TIT2 | Sound.id3.songName |
| TPE1 | Sound.id3.artist |
| TRCK | Sound.id3.track |
| TYER | Sound.id3.year |
下表描述了在 Sound 类中受支持但不具有预定义属性的 ID3 标签。通过调用 mySound.id3.TFLT 和 mySound.id3.TIME 等来访问它们。
| 属性 | 说明 |
| TFLT | 文件类型 |
| TIME | 时间 |
| TIT1 | 内容组说明 |
| TIT2 | 标题/歌曲名称/内容说明 |
| TIT3 | 副标题/说明精选 |
| TKEY | 初始密钥 |
| TLAN | 语言 |
| TLEN | 长度 |
| TMED | 媒体类型 |
| TOAL | 原始唱片/影片/演出标题 |
| TOFN | 原始文件名 |
| TOLY | 原词作者/乐谱作者 |
| TOPE | 原始艺术家/表演者 |
| TORY | 原始发行年份 |
| TOWN | 文件所有者/获得授权者 |
| TPE1 | 主要表演者/独奏(独唱) |
| TPE2 | 乐队/管弦乐队/伴奏 |
| TPE3 | 指挥/主要演奏者 |
| TPE4 | 翻译、混录员或以其它方式进行修改的人员 |
| TPOS | 歌曲集部分 |
| TPUB | 发行者 |
| TRCK | 歌曲集中的曲目编号/位置 |
| TRDA | 录制日期 |
| TRSN | Internet 无线电台名称 |
| TRSO | Internet 无线电台所有者 |
| TSIZ | 大小 |
| TSRC | ISRC(国际标准音像制品编码) |
| TSSE | 用于编码的软件/硬件和设置 |
| TYER | 年份 |
| WXXX | URL 链接帧 |
使用此属性时,请考虑 Flash Player 安全模型:
id3 属性。 对于其它沙箱中的文件,则需经过安全检查。load() 方法加载声音时,可指定 context 参数,该参数为一个 SoundLoaderContext 对象。如果将 SoundLoaderContext 对象的 checkPolicyFile 属性设为 true,则 Flash Player 将在从其中加载声音的服务器上查找 URL 策略文件。如果存在一个策略文件并且允许从执行加载的 SWF 文件的域进行访问,则允许该文件访问 Sound 对象的 id3 属性;否则将不允许。但在 Adobe AIR 中,application 安全沙箱中的内容(使用 AIR 应用程序安装的内容)不受这些安全限制的约束。
有关安全性的详细信息,请参阅以下部分:
另请参见
在 init() 函数中,加载了声音文件,但没有将其设置为播放。如果该文件中包含 ID3 信息,将调度 id3 事件并填充声音文件的 id3 属性。id3 属性包含一个 ID3Info 对象,其中包含所有 ID3 信息。
在 id3Handler() 方法中,将该文件的 ID3 标签存储在 ID3Info 类对象 id3 中。DIV 用于显示 ID3 标签列表。for 循环将循环访问所有 ID3 2.0 标签,并将名称和值附加到 DIV 的内容中。通过使用 ID3 信息 (ID3Info) 属性,还可以附加歌手、歌曲名称和专辑。
注意:要测试此示例,请执行以下操作:
-->
<html>
<head>
<script src="AIRAliases.js"></script>
<script>
var snd;
function init()
{
snd = new air.Sound();
snd.addEventListener(air.Event.ID3, id3Handler);
snd.load(new air.URLRequest("test.mp3"));
}
function id3Handler(event)
{
var id3 = snd.id3;
var id3Div = document.getElementById("id3Div");
id3Div.innerHTML = "";
id3Div.innerHTML += "Artist: " + id3.artist + "<br/>";
id3Div.innerHTML += "Song name: " + id3.songName + "<br/>";
id3Div.innerHTML += "Album: " + id3.album + "<br/>";
}
</script>
</head>
<body onload='init()'>
<h1>ID3 info:</h1>
<div id="id3Div"></div>
</body>
</html>
| isBuffering | 属性 |
isBuffering:Boolean [只读 (read-only)] | 运行时版本: | 1.0 |
返回外部 MP3 文件的缓冲状态。如果值为 true,则在对象等待获取更多数据时,当前将会暂停任何回放。
| length | 属性 |
| url | 属性 |
url:String [只读 (read-only)] | 运行时版本: | 1.0 |
从中加载此声音的 URL。此属性只适用于使用 Sound.load() 方法加载的 Sound 对象。对于与 SWF 文件库中的声音资源关联的 Sound 对象,url 属性的值为 null。
首次调用 Sound.load() 时,url 属性最初具有 null 值,因为最终 URL 未知。只要从 Sound 对象中调度了 open 事件,url 属性就会具有非空值。
url 属性包含已从其中加载了声音的最终、绝对 URL。url 的值通常与传递给 Sound.load() 的 stream 参数的值相同。但是,如果已将一个相对 URL 传递给 Sound.load(),则 url 属性的值将表示绝对 URL。此外,如果 HTTP 服务器重定向原始 URL 请求,url 属性的值将反映从其中实际下载声音文件的最终 URL。 这种报告绝对、最终 URL 的行为与 LoaderInfo.url 的行为等效。
另请参见
| Sound | () | 构造函数 |
function Sound(stream:URLRequest = null, context:SoundLoaderContext = null)| 运行时版本: | 1.0 |
创建一个新的 Sound 对象。如果将有效的 URLRequest 对象传递到 Sound 构造函数,该构造函数将自动调用 Sound 对象的 load() 函数。如果未将有效的 URLRequest 对象传递到 Sound 构造函数,则必须自己调用 Sound 对象的 load() 函数,否则将不加载流。
一旦对某个 Sound 对象调用了 load(),就不能再将另一个声音文件加载到该 Sound 对象中。若要加载另一个声音文件,请创建新的 Sound 对象。
sampleData 事件处理函数将声音动态加载到 Sound 对象中,而不是使用 load()。
参数 stream:URLRequest (default = null) — 指向外部 MP3 文件的 URL。
| |
context:SoundLoaderContext (default = null) — 一个可选的 SoundLoader 上下文对象,可以定义缓冲时间(MP3 数据保留到 Sound 对象的缓冲区中所需的最小毫秒数)并且可以指定加载声音前应用程序是否应该检查跨域策略文件。
|
| close | () | 方法 |
function close():void| 运行时版本: | 1.0 |
关闭该流,从而停止所有数据的下载。调用 close() 方法之后,将无法从流中读取数据。
IOError — 无法关闭该流,或者该流未打开。
|
clickHandler() 方法。它处理声音文件的启动和停止操作。Sound.load() 方法用来加载声音数据。Sound.close() 方法用来停止声音流。try...catch 块用于捕获在关闭流时可能发生的任何 I/O 错误。
-->
<html>
<head>
<script src="AIRAliases.js"></script>
<script>
var button;
var snd;
var channel;
function init() {
button = document.getElementById("playButton");
}
function clickHandler()
{
if (button.value == "Play")
{
var req = new air.URLRequest("test.mp3");
snd = new air.Sound();
snd.load(req);
channel = snd.play();
snd.addEventListener(air.IOErrorEvent.IO_ERROR, errorHandler);
button.value = "Stop";
}
else
{
air.SoundMixer.stopAll();
snd.close();
channel.stop();
button.value = "Play";
}
}
function errorHandler(event) {
air.trace("Couldn't load the file " + event.text);
}
</script>
</head>
<body onload='init()'>
<input id="playButton" type="button" value="Play" onclick="clickHandler()"/>
</body>
</html>| extract | () | 方法 |
function extract(target:ByteArray, length:Number, startPosition:Number = -1):Number| 运行时版本: | 1.5 |
从 Sound 对象提取原始声音数据。
当您通过将分配给 sampleData 事件的函数用于不同的 Sound 对象,从而使用动态生成的音频时,可以使用此方法。即,您可以使用此方法从 Sound 对象中提取声音数据。然后,可以将此数据写入另一 Sound 对象用于对动态音频进行流式处理的字节数组。
将音频数据放在目标字节数组中(从该字节数组的当前位置开始)。音频数据始终公开为 44100 Hz 立体声。样本类型是一个 32 位浮点值,可以使用 ByteArray.readFloat() 将该值转换为一个数字。
参数
target:ByteArray — 用于放置提取的声音样本的 ByteArray 对象。
| |
length:Number — 要提取的声音样本数。样本包含左声道和右声道,即 2 个 32 位浮点值。
| |
startPosition:Number (default = -1) — 开始提取处的样本。如果未指定值,则对 Sound.extract() 的第一个调用将在声音的开头启动;未指定 startPosition 值的后续调用将按顺序通过该文件。
|
Number — Sound 对象中可用的样本数。
|
另请参见
| load | () | 方法 |
function load(stream:URLRequest, context:SoundLoaderContext = null):void| 运行时版本: | 1.0 |
启动从指定 URL 加载外部 MP3 文件的过程。如果为 Sound 构造函数提供有效的 URLRequest 对象,该构造函数将为您调用 Sound.load()。只有在未将有效的 URLRequest 对象传递到 Sound 构造函数或传递了 null 值的情况下,才需要自己调用 Sound.load()。
一旦对某个 Sound 对象调用了 load(),就不能再将另一个声音文件加载到该 Sound 对象中。若要加载另一个声音文件,请创建新的 Sound 对象。
参数
stream:URLRequest — 指向外部 MP3 文件的 URL。
| |
context:SoundLoaderContext (default = null) — 一个可选的 SoundLoader 上下文对象,可以定义缓冲时间(MP3 数据保留到 Sound 对象的缓冲区中所需的最小毫秒数)并且可以指定加载声音前应用程序是否应该检查跨域策略文件。
|
IOError — 网络错误导致加载失败。
| |
SecurityError — 本地不受信任的 文件可能无法与 Internet 进行通信。可以通过将此文件重新分类为受信任的文件来解决此问题。
| |
SecurityError — 如果尝试连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 编程》一书的“安全性”一章中的“限制网络 API”。
| |
IOError — stream 对象的 digest 属性不是 null。如果在加载 SWZ 文件(一个 Adobe 平台组件)时调用 URLLoader.load() 方法,仅应设置 URLRequest 对象的 digest 属性。
| |
SecurityError — 如果尝试连接到常用的保留端口。有关已阻止的端口的完整列表,请参阅《ActionScript 3.0 编程》一书的“安全性”一章中的“限制网络 API”。
|
在 init() 方法中,try...catch 块中加载了该文件,以便捕获在加载文件时可能发生的任何错误。如果发生 I/O 错误,还会调用 errorHandler() 方法,并在用于显示进度报告的文本字段中写入错误消息。当加载操作正在进行时,将调度 progress 事件并调用 progressHandler() 方法。此处,使用 progress 事件作为计时器来计算加载进度。
progressHandler() 函数将随 ProgressEvent 对象传递的 bytesLoaded 值除以 bytesTotal 值,以得出正在加载的声音数据的百分比。然后,它在文本字段中显示这些值。请注意,对于本地文件,进度可能不太明显;可能需要加载来自网络的 MP3 文件来查看进度。
注意:要测试此示例,请执行以下操作:
<html>
<head>
<script src="AIRAliases.js"></script>
<script>
var statusTextField;
var snd;
function init()
{
statusTextArea = document.getElementById("statusTextArea");
var req = new air.URLRequest("test.mp3");
snd = new air.Sound();
try
{
snd.load(req);
snd.play();
}
catch (err)
{
air.trace(err.message);
}
snd.addEventListener(air.IOErrorEvent.IO_ERROR, errorHandler);
snd.addEventListener(air.ProgressEvent.PROGRESS, progressHandler);
}
function progressHandler(event) {
var loadTime = event.bytesLoaded / event.bytesTotal;
var loadPercent = Math.round(100 * loadTime);
statusTextArea.value = loadPercent + "%.";
}
function errorHandler(errorEvent) {
statusTextField.value = "The sound could not be loaded: " + errorEvent.text;
}
</script>
</head>
<body onload='init()'>
Percent loaded:
<input id="statusTextArea" type="textarea" value="foo"/>
</body>
</html>
| play | () | 方法 |
function play(startTime:Number = 0, loops:int = 0, sndTransform:SoundTransform = null):SoundChannel| 运行时版本: | 1.0 |
生成一个新的 SoundChannel 对象来回放该声音。此方法返回 SoundChannel 对象,访问该对象可停止声音并监控音量。(若要控制音量、平移和平衡,请访问分配给声道的 SoundTransform 对象。)
参数
startTime:Number (default = 0) — 应开始回放的初始位置(以毫秒为单位)。
| |
loops:int (default = 0) — 定义在声道停止回放之前,声音循环回 startTime 值的次数。
| |
sndTransform:SoundTransform (default = null) — 分配给该声道的初始 SoundTransform 对象。
|
SoundChannel — SoundChannel 对象,用于控制声音。如果没有声卡或用完了可用的声道,此方法将返回 null。一次最多可以使用 32 个声道。
|
另请参见
在 playSound() 函数中,soundPosition 对象的值用于确定用户希望的文件起始位置。该值采用百分比表示,与声音中的字节数相乘,然后传递给 Sound 对象的 play() 方法。
注意:要测试此示例,请执行以下操作:
<html>
<head>
<script src="AIRAliases.js"></script>
<script>
var snd = new air.Sound();
var channel = new air.SoundChannel();
function init() {
var req = new air.URLRequest("test.mp3");
snd.load(req);
}
function playSound() {
var position = document.getElementById("soundPosition").value;
if (position < 0 || position > 100)
{
alert("Out of range");
}
var cue = (position / 100) * snd.length;
channel.stop();
channel = snd.play(cue);
}
</script>
</head>
<body onload='init()'>
<p>Specify where to start the sound:</p>
<input id="soundPosition" type="textarea" value="0" /> %
<input type="button" onclick="playSound()" value="Play"/>
</body>
</html>init() 方法将 MP3 文件加载到 air.Sound 对象。确保在 HTML 文件所在的同一目录中包含 test.mp3 文件。
当用户单击第一个按钮时,play1() 函数播放一次声音。当用户单击第二个按钮时,play2() 函数播放两次声音。在 play2() 函数中,Sound 的 play() 方法的第二个参数设置为 1,表示声音将返回到声音开始处一次并重新播放。开始时间(第一个参数)设置为 0,则将从开始处播放 MP3 文件。
注意:要测试此示例,请执行以下操作:
<html>
<head>
<script src="AIRAliases.js" />
<script>
var snd = new air.Sound();
function init() {
var req = new air.URLRequest("test.mp3");
snd.load(req);
}
function play1() {
snd.play();
}
function play2() {
snd.play(0, 2);
}
</script>
</head>
<body onload='init()'>
<input type="button" value="Play 1" onclick="play2()" />
<br/>
<input type="button" value="Play 2" onclick="play2()" />
</body>
</html>| complete | 事件 |
flash.events.Eventflash.events.Event.COMPLETE| 运行时版本: | 1.0 |
成功加载数据后调度。
Event.COMPLETE 常量定义 complete 事件对象的 type 属性值。
此事件具有以下属性:
| 属性 | 值 |
|---|---|
bubbles | false |
cancelable | false;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 已完成加载的网络对象。 |
另请参见
| id3 | 事件 |
flash.events.Eventflash.events.Event.ID3| 运行时版本: | 1.0 |
在存在可用于 MP3 声音的 ID3 数据时由 Sound 对象调度。
Event.ID3 常量定义 id3 事件对象的 type 属性值。
此事件具有以下属性:
| 属性 | 值 |
|---|---|
bubbles | false |
cancelable | false;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 加载 MP3 的 Sound 对象,ID3 数据现在可用于此对象。target 不一定是显示列表中注册此事件侦听器的对象。请使用 currentTarget 属性来访问显示列表中当前正在处理此事件的对象。 |
另请参见
| ioError | 事件 |
flash.events.IOErrorEventflash.events.IOErrorEvent.IO_ERROR| 运行时版本: | 1.0 |
在出现输入/输出错误并由此导致加载操作失败时调度。
定义ioError 事件对象的 type 属性值。
此事件具有以下属性:
| 属性 | 值 |
|---|---|
bubbles | false |
cancelable | false;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
errorID | 与特定错误关联的引用编号(仅限 AIR)。 |
target | 发生输入/输出错误的网络对象。 |
text | 要显示为错误消息的文本。 |
另请参见
| open | 事件 |
flash.events.Eventflash.events.Event.OPEN| 运行时版本: | 1.0 |
在加载操作开始时调度。
Event.OPEN 常量用于定义 open 事件对象的 type 属性值。
此事件具有以下属性:
| 属性 | 值 |
|---|---|
bubbles | false |
cancelable | false;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 已打开连接的网络对象。 |
另请参见
| progress | 事件 |
flash.events.ProgressEventflash.events.ProgressEvent.PROGRESS| 运行时版本: | 1.0 |
在加载操作进行过程中接收到数据时调度。
定义progress 事件对象的 type 属性值。
此事件具有以下属性:
| 属性 | 值 |
|---|---|
bubbles | false |
bytesLoaded | 在侦听器处理事件时加载的项数或字节数。 |
bytesTotal | 如果加载进程成功,最终将加载的项目或字节总数。 |
cancelable | false;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
target | 报告进度的对象。 |
另请参见
| sampleData | 事件 |
flash.events.SampleDataEventflash.events.Event.SAMPLE_DATA| 运行时版本: | 1.5 |
当播放器请求新的音频数据时调度。
var mySound = new air.Sound();
mySound.addEventListener(air.SampleDataEvent.SAMPLE_DATA, sineWaveGenerator);
mySound.play();
function sineWaveGenerator(event)
{
for (i = 0; i < 8192; i++)
{
var value = Math.sin((i + event.position) / 2) * 0.25;
event.data.writeFloat(value);
event.data.writeFloat(value);
}
}
另请参见
注意:要测试此示例,请执行以下操作:
<html>
<head>
<script src="AIRAliases.js" />
<script>
function init() {
var request = new air.URLRequest("app://MySound.mp3");
var soundFactory = new air.Sound();
soundFactory.addEventListener(air.Event.COMPLETE, completeHandler);
soundFactory.addEventListener(air.Event.ID3, id3Handler);
soundFactory.addEventListener(air.IOErrorEvent.IO_ERROR, ioErrorHandler);
soundFactory.addEventListener(air.ProgressEvent.PROGRESS, progressHandler);
soundFactory.load(request);
song = soundFactory.play();
}
function completeHandler(event) {
air.trace("completeHandler: " + event);
}
function id3Handler(event) {
air.trace("id3Handler: " + event);
}
function ioErrorHandler(event) {
air.trace("ioErrorHandler: " + event);
}
function progressHandler(event) {
air.trace("progressHandler: " + event);
}
</script>
</head>
<body onload='init()'>
</body>
</html>