捕获声音输入

应用程序可通过 Microphone 类连接到用户系统上的麦克风或其他声音输入设备。应用程序可将输入音频广播到该系统的扬声器,或者将音频数据发送到远程服务器,如 Flash Media Server。您无法访问源自麦克风的原始音频数据;只能将音频发送到系统的扬声器或将压缩音频数据发送到远程服务器。对于发送到远程服务器的数据,可以使用 Speex 或 Nellymoser 编解码器。(在 AIR 1.5 中可以使用 Speex 编解码器。)

访问麦克风

Microphone 类没有构造函数方法。相反,应使用静态 Microphone.getMicrophone() 方法来获取新的 Microphone 实例,如下例所示:

var mic = air.Microphone.getMicrophone(); 

不使用参数调用 Microphone.getMicrophone() 方法时,将返回在用户系统上发现的第一个声音输入设备。

系统可能连接了多个声音输入设备。应用程序可以使用 Microphone.names 属性来获取所有可用声音输入设备名称的数组。然后,它可以使用 index 参数(与数组中的设备名称的索引值相匹配)来调用 Microphone.getMicrophone() 方法。

系统可能没有连接麦克风或其他声音输入设备。可以使用 Microphone.names 属性或 Microphone.getMicrophone() 方法来检查用户是否安装了声音输入设备。如果用户未安装声音输入设备,则 names 数组的长度为零,并且 getMicrophone() 方法返回值 null

将麦克风音频传送到本地扬声器

可以使用参数值 true 调用 Microphone.setLoopback() 方法,以将来自麦克风的音频输入传送到本地系统扬声器。

如果将来自本地麦克风的声音传送到本地扬声器,则会存在产生音频回馈循环的风险。这可能会导致非常大的振鸣声,并且可能会损坏声音硬件。使用参数值 true 调用 Microphone.setUseEchoSuppression() 方法可降低发生音频回馈的风险,但不会完全消除该风险。Adobe 建议务必在调用 Microphone.setLoopback(true) 之前调用 Microphone.setUseEchoSuppression(true) ,除非您确信用户使用耳机或除扬声器以外的某种设备来播放声音。

以下代码说明了如何将来自本地麦克风的音频传送到本地系统扬声器:

var mic = air.Microphone.getMicrophone(); 
mic.setUseEchoSuppression(true); 
mic.setLoopBack(true);

更改麦克风音频

应用程序可以使用两种方法更改来自麦克风的音频数据。第一,它可以更改输入声音的增益,这实际上是将输入值乘以指定数值。这样可产生更大或更小的声音。 Microphone.gain 属性接受介于 0 和 100 之间的数值。值 50 相当于乘数 1,它指定正常音量。值 0 相当于乘数 0,它可有效地将输入音频静音。大于 50 的值指定的音量高于正常音量。

应用程序也可以更改输入音频的采样率。较高的采样率可提高声音品质,但它们也会创建更密集的数据流(使用更多的资源进行传输和存储)。 Microphone.rate 属性表示以千赫 (kHz) 为单位测量的音频采样率。默认采样率是 8 kHz。如果麦克风支持较高的采样率,您可以将 Microphone.rate 属性设置为高于 8 kHz 的值。例如,如果将 Microphone.rate 属性设置为 11,则会将采样率设置为 11 kHz;如果将其设置为 22,则会将采样率设置为 22 kHz,依此类推。采样率取决于所选择的编解码器。如果使用的是 Nellymoser 编解码器,则可以指定 5、8、11、16、22 和 44 kHz 作为采样率。如果使用的是 Speex 编解码器(在 AIR 1.5 中可用),则只能使用 16 kHz。

检测麦克风活动

为节省带宽和处理资源,运行时将尝试检测何时麦克风不传输声音。在麦克风的活动级别处于静音级别阈值以下一段时间后,运行时将停止传输音频输入并调度 activity 事件。如果使用 Speex 编解码器(在 AIR 1.5 中可用),请将静音级别设置为 0,以确保应用程序能够持续传输音频数据。Speex 语音活动检测将自动减少带宽。

Microphone 类的以下三个属性用于监视和控制活动检测:

  • activityLevel 只读属性指示麦克风检测的音量,范围从 0 到 100。

  • silenceLevel 属性指定激活麦克风并调度 activity 事件所需的音量。 silenceLevel 属性也使用从 0 到 100 的范围,默认值为 10。

  • silenceTimeout 属性描述活动级别必须处于静音级别以下多长时间(以毫秒为单位)后,才会调度 activity 事件。 silenceTimeout 默认值是 2000。

Microphone.silenceLevel 属性和 Microphone.silenceTimeout 属性都是只读的,但可以使用 Microphone.setSilenceLevel() 方法来更改它们的值。

在某些情况下,在检测到新活动时激活麦克风的过程可能会导致短暂的延迟。通过将麦克风始终保持活动状态,可以消除此类激活延迟。应用程序可以调用 Microphone.setSilenceLevel() 方法并将 silenceLevel 参数设置为零。这样可将麦克风保持活动状态并持续收集音频数据,即使未检测到任何声音也是如此。反之,如果将 silenceLevel 参数设置为 100,则可以完全禁止激活麦克风。

以下示例显示了有关麦克风的信息,并报告 Microphone 对象调度的 activity 事件和 status 事件:

var deviceArray = air.Microphone.names; 
air.trace("Available sound input devices:"); 
for (i = 0; i < deviceArray.length; i++) 
{ 
    air.trace("   " + deviceArray[i]); 
} 
 
var mic = air.Microphone.getMicrophone(); 
mic.gain = 60; 
mic.rate = 11; 
mic.setUseEchoSuppression(true); 
mic.setLoopBack(true); 
mic.setSilenceLevel(5, 1000); 
     
mic.addEventListener(air.ActivityEvent.ACTIVITY, this.onMicActivity); 
     
var micDetails = "Sound input device name: " + mic.name + '\n'; 
micDetails += "Gain: " + mic.gain + '\n'; 
micDetails += "Rate: " + mic.rate + " kHz" + '\n'; 
micDetails += "Muted: " + mic.muted + '\n'; 
micDetails += "Silence level: " + mic.silenceLevel + '\n'; 
micDetails += "Silence timeout: " + mic.silenceTimeout + '\n'; 
micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n'; 
air.trace(micDetails); 
 
function onMicActivity(event) 
{ 
    air.trace("activating=" + event.activating + ", activityLevel=" +  
        mic.activityLevel); 
}

在运行上面的示例时,对着系统麦克风说话或发出噪音,并观察所生成的、显示在控制台中的 trace 语句。

向媒体服务器发送音频以及从中接收音频

使用 Flash Media Server 等流媒体服务器时,可以使用额外的音频功能。

特别是应用程序可以将 Microphone 对象附加到 runtime.flash.net.NetStream 对象上,并将数据直接从用户麦克风传输到服务器。也可以将音频数据从服务器流式传输到 AIR 应用程序。

AIR 1.5 引入了对 Speex 编解码器的支持。若要设置向媒体服务器发送的压缩音频所使用的编解码器,请设置 Microphone 对象的 codec 属性。此属性可以包含两个值,可使用 SoundCodec 类对这两个值进行枚举。将 codec 属性设置为 SoundCodec.SPEEX 将选择使用 Speex 编解码器来压缩音频。将该属性设置为 SoundCodec.NELLYMOSER (默认值)将选择使用 Nellymoser 编解码器来压缩音频。

有关详细信息,请参阅 http://www.adobe.com/support/documentation 上提供的在线 Flash Media Server 文档。