Flash 麦克风操作
Microphone 类没有构造函数方法。相反,应使用静态 Microphone.getMicrophone()
方法来获取新的 Microphone 实例,如下所示:
var mic:Microphone = Microphone.getMicrophone();
不使用参数调用 Microphone.getMicrophone()
方法时,将返回在用户系统上发现的第一个声音输入设备。
系统可能连接了多个声音输入设备。应用程序可以使用 Microphone.names
属性来获取所有可用声音输入设备名称的数组。然后,它可以使用 index
参数(与数组中的设备名称的索引值相匹配)来调用 Microphone.getMicrophone()
方法。
系统可能没有连接麦克风或其它声音输入设备。可以使用 Microphone.names
属性或 Microphone.getMicrophone()
方法来检查用户是否安装了声音输入设备。如果用户未安装声音输入设备,则 names
数组的长度为零,并且 getMicrophone()
方法返回值 null
。
当应用程序调用 Microphone.getMicrophone()
方法时,Flash Player 将显示“Flash Player 设置”对话框,它提示用户允许或拒绝 Flash Player 对系统上的摄像头和麦克风的访问。在用户单击此对话框中的“允许”或“拒绝”按钮后,将调度 StatusEvent。该 StatusEvent 实例的 code
属性指示是允许还是拒绝对麦克风的访问,如下例所示:
import flash.media.Microphone;
var mic:Microphone = Microphone.getMicrophone();
mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);
function onMicStatus(event:StatusEvent):void
{
if (event.code == “Microphone.Unmuted”)
{
trace(“Microphone access was allowed.”);
}
else if (event.code == “Microphone.Muted”)
{ trace(“Microphone access was denied.”);
}
}
如果允许访问,StatusEvent.code
属性将包含“Microphone.Unmuted”;如果拒绝访问,则包含“Microphone.Muted”。
注意 | 当用户允许或拒绝对麦克风的访问时,Microphone.muted 属性将被分别设置为 true 或 false 。但是,在调度 StatusEvent 之前,不会在 Microphone 实例上设置 muted 属性,因此,应用程序还应等待调度 StatusEvent.STATUS 事件后再检查 Microphone.muted 属性。 |
将麦克风音频传送到本地扬声器
可以使用参数值 true
调用 Microphone.setLoopback()
方法,以将来自麦克风的音频输入传送到本地系统扬声器。
如果将来自本地麦克风的声音传送到本地扬声器,则会存在创建音频回馈循环的风险,这可能会导致非常大的振鸣声,并且可能会损坏声音硬件。使用参数值 true
调用 Microphone.setUseEchoSuppression()
方法可降低发生音频回馈的风险,但不会完全消除该风险。Adobe 建议您始终在调用 Microphone.setLoopback(true)
之前调用 Microphone.setUseEchoSuppression(true)
,除非您确信用户使用耳机来回放声音,或者使用除扬声器以外的某种设备。
以下代码说明了如何将来自本地麦克风的音频传送到本地系统扬声器:
var mic:Microphone = Microphone.getMicrophone();
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);
更改麦克风音频
应用程序可以使用两种方法更改来自麦克风的音频数据。第一,它可以更改输入声音的增益,这会有效地将输入值乘以指定的数值以创建更大或更小的声音。Microphone.gain
属性接受介于 0 和 100 之间的数值(含 0 和 100)。值 50 相当于乘数 1,它指定正常音量。值 0 相当于乘数 0,它可有效地将输入音频静音。大于 50 的值指定的音量高于正常音量。
应用程序也可以更改输入音频的采样率。较高的采样率可提高声音品质,但它们也会创建更密集的数据流(使用更多的资源进行传输和存储)。Microphone.rate
属性表示以千赫 (kHz) 为单位测量的音频采样率。默认采样率是 8 kHz。如果麦克风支持较高的采样率,您可以将 Microphone.rate
属性设置为高于 8 kHz 的值。例如,如果将 Microphone.rate
属性设置为值 11,则会将采样率设置为 11 kHz;如果将其设置为 22,则会将采样率设置为 22 kHz,依此类推。
检测麦克风活动
为节省带宽和处理资源,Flash Player 将尝试检测何时麦克风不传输声音。当麦克风的活动级别处于静音级别阈值以下一段时间后,Flash Player 将停止传输音频输入,并调度一个简单的 ActivityEvent。
Microphone 类的以下三个属性用于监视和控制活动检测:
activityLevel
只读属性指示麦克风检测的音量,范围从 0 到 100。silenceLevel
属性指定激活麦克风并调度ActivityEvent.ACTIVITY
事件所需的音量。silenceLevel
属性也使用从 0 到 100 的范围,默认值为 10。silenceTimeout
属性描述活动级别处于静音级别以下多长时间(以毫秒为单位)后,才会调度ActivityEvent.ACTIVITY
事件以指示麦克风现在处于静音状态。silenceTimeout
默认值是 2000。
Microphone.silenceLevel
属性和 Microphone.silenceTimeout
属性都是只读的,但可以使用 Microphone.setSilenceLevel()
方法来更改它们的值。
在某些情况下,在检测到新活动时激活麦克风的过程可能会导致短暂的延迟。通过将麦克风始终保持活动状态,可以消除此类激活延迟。应用程序可以调用 Microphone.setSilenceLevel()
方法并将 silenceLevel
参数设置为零,以通知 Flash Player 将麦克风保持活动状态并持续收集音频数据,即使未检测到任何声音也是如此。反之,如果将 silenceLevel
参数设置为 100,则可以完全禁止激活麦克风。
以下示例显示了有关麦克风的信息,并报告 Microphone 对象调度的活动事件和状态事件:
import flash.events.ActivityEvent;
import flash.events.StatusEvent;
import flash.media.Microphone;
var deviceArray:Array = Microphone.names;
trace(“Available sound input devices:”);
for (var i:int = 0; i < deviceArray.length; i++)
{
trace(” ” + deviceArray[i]);
}
var mic:Microphone = Microphone.getMicrophone();
mic.gain = 60;
mic.rate = 11;
mic.setUseEchoSuppression(true);
mic.setLoopBack(true);
mic.setSilenceLevel(5, 1000);
mic.addEventListener(ActivityEvent.ACTIVITY, this.onMicActivity);
mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);
var micDetails:String = “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’;
trace(micDetails);
function onMicActivity(event:ActivityEvent):void
{
trace(“activating=” + event.activating + “, activityLevel=” +
mic.activityLevel);
}
function onMicStatus(event:StatusEvent):void
{
trace(“status: level=” + event.level + “, code=” + event.code);
}
在运行上面的示例时,对着系统麦克风说话或发出噪音,并观察所生成的、显示在控制台或调试窗口中的 trace 语句。
向媒体服务器发送音频以及从中接收音频
将 ActionScript 与 Flash Media Server 等流媒体服务器配合使用时,可以使用额外的音频功能。
特别地,应用程序可以将 Microphone 对象附加到 NetStream 对象上,并将数据直接从用户麦克风传输到服务器。也可以将音频数据从服务器流式传输到 Flash 或 Flex 应用程序,并将其作为 MovieClip 的一部分或使用 Video 对象进行回放。
有关详细信息,请参阅 http://livedocs.macromedia.com 上提供的在线 Flash Media Server 文档。
示例:Podcast Player
播客是通过 Internet 以按需方式或订阅方式分发的声音文件。播客通常是作为系列的一部分发布的,此系列也称为播客频道。由于播客节目的持续时间从一分钟到数小时不等,因此,通常在播放的同时对其进行流式传输。播客节目(也称为项目)通常是以 mp3 文件格式提供的。视频播客也非常受欢迎,但此范例应用程序仅播放使用 mp3 文件的音频播客。
此示例并不是一个功能完备的播客聚合器应用程序。例如,它不能管理对特定播客的订阅,或在下次运行应用程序时记住用户已收听的播客。它可用作功能更完备的播客聚合器的起点。
Podcast Player 示例说明了以下 ActionScript 编程方法:
- 读取外部 RSS 新闻频道并分析其 XML 内容
- 创建 SoundFacade 类以简化加载和回放声音文件的过程
- 显示声音回放进度
- 暂停和恢复声音回放
要获取该范例的应用程序文件,请访问 www.adobe.com/go/learn_programmingAS3samples_flash_cn。Podcast Player 应用程序文件位于文件夹 Samples/PodcastPlayer 中。该应用程序包含以下文件:
文件 | 描述 |
---|---|
PodcastPlayer.mxml
或 PodcastPlayer.fla |
适用于 Flex (MXML) 或 Flash (FLA) 的应用程序的用户界面。 |
RSSBase.as | 为 RSSChannel 类和 RSSItem 类提供公共属性和方法的基类。 |
RSSChannel.as | 保存 RSS 频道的相关数据的 ActionScript 类。 |
RSSItem.as | 保存 RSS 项目的相关数据的 ActionScript 类。 |
SoundFacade.as | 应用程序的主 ActionScript 类。它封装 Sound 类和 SoundChannel 类的方法和事件,并添加对回放暂停和恢复的支持。 |
URLService.as | 从远程 URL 检索数据的 ActionScript 类。 |
playerconfig.xml | 这是一个 XML 文件,其中包含表示播客频道的 RSS 新闻频道列表。 |
原文:http://hi.baidu.com/hys_no1/blog/item/313926fa466429294e4aea25.html
本文出自 传播、沟通、分享,转载时请注明出处及相应链接。
本文永久链接: https://www.nickdd.cn/?p=1140