声音在Flash Player中回声消除的最佳做法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
声音在Flash Player中
回声消除的最佳做法
原文查看
必备知识
需要先进的知识,在ActionScript中,Adobe Flash播放器和Adobe Flash Builder或Adobe Flash Professional中的音频。
用户级别
中级
所需产品
●Flash Builder中(下载试用版)
●Flash播放器
Adobe Flash Player 已经成为非常受欢迎的音频和视频的播放;事实上,大多数的互联网视频是使用Flash Player 来查看的。
Flash 播放器提供这两个一个丰富的观看体验和高效率、高质量的视频播放,如纳入技术先进的音频和视频压缩方案(H.264、MP3 和AAC 编解码器)、多才多艺的媒体功能(多比特率流、播放列表、寻求,和其他功能)和有效回放机制(硬件解码和直接渲染)。
在桌面计算机上它无处不在的渗透和其在移动设备上的日益普及,已大量使用Flash Player 的实时音频和视频通信感兴趣。
视频广播相比,然而,实时通信具有完全不同的要求。
最重要的要求包括:
通信的终结点之间的最小化滞后时间
高质量、有弹性错误语音编解码器
回声取消耳机免费体验
虽然Flash Player 自2002 年以来已有音频/视频功能和已用于web 会议解决方案,例如Adobe 连接和大的蓝色按钮,在作为例子,真正改变游戏规则的事件发生与版本的Flash 播放器10 2008 年推出的低延迟传输协议和新的声音编解码器,使Flash Player 非常适合用于实时通信。
在本文中,我将简要地描述实时通信和Flash Player 如何满足这些需要的要求。
我还会引入新的ActionScript API 的使用增强的音频、为您提供最佳做法和限制,并给你看一个示例应用程序。
实时通信的要求
2002 年,Flash 播放器6 介绍了实时消息传递协议(RTMP) 和Nellymoser声音编解码器。
Flash 通信服务器MX 的帮助下,一个能开发实时通信应用程序操作两个或多个Flash Player 终结点之间。
RTMP 基于传输控制协议(TCP),它提供可靠的数据传输的价位的无界时滞——这意味着它可以是任意的高。
无错误的传输接受的方式是通过重复丢失的数据包。
如果数据包不迷路,延迟可能会非常高,因为丢失的数据包需要得到本处。
Nellymoser 是一种专有的编解码器,提供低压缩效率和有限的行业的支持。
由于RTMP,音频邮件将
永远不会丢失,但可能会因网络或服务器问题排队。
打击滞后时间积累,所谓追赶的机制被受雇于Flash Player,其中音频播放出比其自然采样速率更快。
这种渐进延迟减少引入只有最小的音频失真不改变音调。
虽然RTMP 非常适合广播和网络广播的应用程序(那里没有严格的延迟要求),它具有有限适用性的实时通信,数百个毫秒的延迟,可能导致谈话无法使用。
在实时通信中,它是更重要的是尽量减少延误除了继续保持无差错传输。
大多数的音频和视频编码技术(如H.264视频编解码器和Speex语音编解码器)的设计与网络传输错误的想法,可以处理它们。
Flash 播放器10 介绍了实时媒体流协议(RTMFP)。
与不同的RTMP,RTMFP 基于用户数据报协议(UDP)。
RTMFP 启用要么可靠地发送数据(使用重传)或不可靠地。
通过使用不可靠的传输,可以最小传输延迟。
此外,RTMFP 使直接的对等连接,不仅可以减少服务器的要求,可以进一步降低通信的终结点之间的延迟。
Flash 播放器10 还介绍了Speex编码解码器。
Speex 是一种开放源代码、免版税的编解码器,得到业界广泛支持。
Flash 支持Speex 编码在16 kHz。
此外,当Speex 用于实时通信,使用RTMFP 传输延迟最小化。
RTMFP 将Speex 的所有邮件都传递到一个更高的层,只要他们在收到。
Flash 播放器使用自适应Speex抖动缓冲区播放出消息时。
Adobe 还实施了Speex 噪声抑制和语音活动检测,保持沉默期间尽量减少传输带宽。
这些功能使实际开发使用RTMFP 和Speex 的实时通信应用程序。
为可以接受的用户体验,与会者应戴耳机以防止回声。
当从计算机的扬声器的声音会反馈到麦克风声学回声时发生。
使用耳机可能在企业环境中,可以接受,但在消费空间中,用户通常使用网络摄像头或内置笔记本电脑麦克风是显然不可取。
为实现普遍适应,声学回声消除(AEC) 是绝对必需的IP 语音(VoIP) 应用程序要求。
AEC 是信使应用程序(如Skype 和Google Talk) 和软电话(如Xlite)中可用。
Adobe Flash 播放器10.3 和Adobe 空气2.7 推行增强的音频,其中包括声学回声消除和降噪制止。
增强的音频是Flash Player 和AIR 所支持的所有桌面平台上可用。
增强的音频API
我们已添加一个新API 到Flash 平台启用增强的音频。
所有支持的Flash Player 和AIR 的桌面平台上提供此功能。
新的API 才可用在ActionScript 3。
你必须在你的创作环境、目标Flash 播放器10.3 或空气2.7 (或以后)和SWF 版本12,您必须更新你的playerglobal.swc。
下面的类会受到影响:
∙Microphone:一种新的静态方法添加到此类来创建增强麦克风和读/写属性用于配置增强的麦克风选项。
∙MicrophoneEnhancedOptions: 这个新的类允许您配置增强的麦克风设置。
∙MicrophoneEnhancedMode:此新类枚举增强的麦克风操作模式。
将音频发送到另一个闪存终结点或Flash 媒体服务器可以与只有几行代码的执行:
var netConnection:NetConnection = new NetConnection();
netConnection.connect("rtmfp:///rtc");
var netStream:NetStream = new NetStream(netConnection);
var microphone:Microphone = Microphone.getMicrophone();
netStream.attachAudio(microphone);
使用增强的音频同样很简单:您可以获得使用的Microphone.getEnhancedMicrophone()静态方法增强的麦克风:
var microphone:Microphone = Microphone.getEnhancedMicrophone();
netStream.attachAudio(microphone);
除了声学回声消除,增强的音频还提供噪声抑制。
以前,Flash Player 仅提供Speex 音频噪声抑制。
新的噪声抑制计划适用于所有捕获音频样本。
噪声抑制由现有noiseSuppressionLevel类的属性,麦克风控制,默认启用的。
将noiseSuppressionLevel设置为0 将禁用噪声抑制。
增强的音频有两方面的局限性:
∙您不能在同一时间使用增强型和非增强音频。
∙在任何给定时间只能使用一个单一的增强音频捕获。
Flash 播放器的派单麦克风状态事件Microphone.UNAVAILABLE当麦克风停止提供音频数据因为上述的理由。
这是一个未成年的限制时相比,非增强的音频,但实际的实时通信的应用程序,有一个正在工作的话筒应该足够。
增强音频的操作是由您的麦克风对象和MicrophoneEnhancedOptions类的enhancedOptions属性来控制的。
类具有以下属性:
∙MicrophoneEnhancedOptions.mode选择增强音频的操作模式。
可能的值,请参阅MicrophoneEnhancedMode类。
默认值是MicrophoneEnhancedMode.HALF_DUPLEX否则USB 捕获设备和MicrophoneEnhancedMode.FULL_DUPLEX。
∙MicrophoneEnhancedOptions.echoPath指定的回声路径长度(以毫秒为单位)。
较长的回声路径意味着更好的回声消除,但也引入了更长的延迟和需要更多的处理能力。
默认值是128 ;可能的值就只是256。
∙MicrophoneEnhancedOptions.nonLinearProcessing指定是否使用非线性处理来抑制残余的回声。
使用时间域技术;默认值是enabled.
在MicrophoneEnhancedMode 类中枚举可用的增强的麦克风操作模式。
支持以下值:∙MicrophneEnhancedMode.FULL_DUPLEX:完整双面打印处理提供最佳质量回声取消。
双方在同
一时间可以发言。
此模式要求高质量的输入和输出设备和最计算力。
这是与内置扬声器和麦克风设备的膝上型计算机的理想选择。
∙MicrophoneEnhancedMode.HALF_DUPLEX:半双工使用全双工比简单处理,因此需要较少的计算能力。
它假定只有一方讲一次。
半双工是USB 麦克风设备的默认模式。
∙MicrophoneEnhancedMode.HEADSET:回声消除运行在低回声模式中,假设这两个当事方都使用头戴式耳机。
这种模式下从扬声器中可能会泄漏的最小回声移除到麦克风。
此模式需要最少的处理。
∙MicrophoneEnhancedMode.SPEAKER_MUTE:回声消除处于关闭状态,但其他语音处理功能(如减少噪音)被启用。
∙MicrophoneEnhancedMode.OFF:所有增强的音频功能处于关闭状态。
MicrophoneEnhancedOptions 的构造函数将设置以下默认属性:
var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
options.mode = MicrophoneEnhancedMode.FULL_DUPLEX;
options.echoPath = 128;
options.nonLinearProcessing = true;
要查询增强的麦克风选项实际上在使用中,请使用以下内容:
var microphone:Microphone = Microphone.getEnhancedMicrophone();
var options:MicrophoneEnhancedOptions = microphone.enhancedOptions;
当你只想要修改某些增强音频参数时,请确保没有创建一个MicrophoneEnhancedOptions 对象,该对象使用的构造函数,因为你可能会无意中覆盖以及其他参数。
当使用具有增强音频麦克风数据生成API (示例数据事件),您将收到回声取消和噪声抑制的样本。
实时通信的最佳做法
为VoIP 应用程序提供最佳的用户体验,你应该使用RTMFP 的Speex 以及增强音频编解码器。
在接收器,确保使用无缓冲的实时流媒体模式通过正确设置您的视频的NetStream 对象的bufferTime属性。
这将确保音频邮件将会以最低延迟不可靠地进行传输。
我强烈建议你使用对等连接,只要有可能尽量减少传输延迟。
这可能不是可行多方通信或当RTMFP 是不可能的(请参见我的文章,使用Flash 媒体服务器的实时协作的最佳做法).
通过使用全双工模式获得最佳质量回声抵消。
如果您有USB 网络摄像机连接到您的便携式计算机,则应使用内置麦克风。
您还可以实现一个用户界面,允许用户选择他或她选择的麦克风。
如在上一节中所述,您可以通过使用下面的声明增强的麦克风:
var microphone:Microphone = Microphone.getEnhancedMicrophone();
上面的代码使用用户在他或她的本地设置管理器中选定的默认麦克风。
Adobe 建议使用的麦克风增强的默认选项。
(增强的麦克风模式的默认值否则是全双工和半双工的USB 设备;回声路径是128 ms 和启用非线性处理。
)
Adobe 也强烈建议你使用Speex 编码解码器。
Speex 捕获和压缩只支持16 khz 频率(播放也支持8 kHz),所以您不需要指定的采样率:
microphone.codec = SoundCodec.SPEEX;
Speex 操作帧的样本;每个帧的20 ms 长(320 样品在16 kHz)。
您可以指定您希望在消息中发送的帧数。
默认值是2,最大值是8。
为了尽量减少延迟,您可能想要发送的每封邮件的单个帧:
microphone.framesPerPacket = 1;
显然,在邮件中发送多个帧减少了传输开销;为每个消息的开销字节数可多达50 个字节(RTMFP/UDP/IP 标头)。
这种开销是很大,不能被忽略。
您可能会考虑延迟和开销(尤其是在一个无线或3 G 方案)之间的权衡,但在大多数情况下,最小化滞后时间是非常可取。
它是非常重要的沉默级别设置为0。
当沉默级别为非零时,将出现不连续的传输。
这可能会对Speex 抖动缓冲区和声学回声取消算法的负面影响。
此外,Speex 执行语音活动检测,并在检测到没有讲话时只使用4 Kbps 的带宽:
microphone.setSilenceLevel(0, 2000);
将沉默级别设置为零的后果之一是您将不再接收活动事件。
如果您的应用程序一直依赖麦克风活动事件来检测用户是否说,你将需要选择另一种方法。
请设置麦克风增益时,大家体谅。
Flash 播放器不会修改系统捕捉或回放音量级别;它只是执行乘法的音频采样。
Speex 和声学回声消除,超载的水平可以导致性能下降。
设置增益到50 不修改示例值,这可能就是最好的办法:
microphone.gain = 50;
不正确的系统麦克风和回放水平可能导致降低音频质量。
您可能希望通知用户要调整其硬件音频级别。
麦克风类支持回声抑制用setUseEchoSuppression()方法。
该算法是很简单:当那里传出的声音,麦克风输入样本的规模除以2。
这会导致可能是不可取的某些应用程序中的不同麦克风声音级别。
当使用增强的音频时,将忽略此回声抑制功能。
使用增强的音频的限制
AEC 是消耗大量计算资源。
目前,只有桌面平台支持Flash Player 和AIR。
虽然AEC 为SIMD 体系结构进行了优化,它可能会占用相当大一部分的低功耗上网本计算机上的CPU 电源。
当AEC 不受支持时,Microphone.getEnhancedMicrophone()返回null.
多党回声抵消是一个很难的问题。
虽然从API 的角度来看,没有什么可以防止创建一个多方通信应用程序,两个参与者的优化性能的增强音频。
回声消除工作,您必须使用无缓冲的音频;就是订阅的视频的NetStream 对象的bufferTime属性必须设置为0。
音频制作的NetStream对象与缓冲时间大于0,将不包括在回声消除。
全双工模式提供最佳质量回声取消和还支持"模棱两可"(同时在说这两个缔约方)。
然而,它需要最的处理能力和良好的硬件。
它不能用于USB 捕获设备因为扬声器的USB 捕获设备和声卡之间的同步当前不支持。
当您使用非增强的音频,和你有多个音频捕获设备,下面的代码按预期方式工作:
ns1.attachAudio(Microphone.getMicrophone(0));
ns2.attachAudio(Microphone.getMicrophone(1));
ns1和ns2在哪儿发布的两个不同视频的NetStream 对象。
每个视频的NetStream 对象发布从各自非
增强麦克风捕捉到的音频。
这是目前不支持时采用增强的音频;在任何给定时间只能有一个单一的增强的麦克风实例。
你也不能有非增强和增强的麦克风,在同一时间捕获音频。
当您使用增强音频和想要打开一个不同的麦克风实例,现有麦克风将停止生产数据和调度Microphone.UNAVAILABLE事件。
以下用例说明了这一点:
使用案例 1
1. 创建麦克风mic1.
2. 创建增强的麦克风mic2;mic1将派出Microphone.UNAVAILABLE状态事件。
使用案例 2
1. 创建增强的麦克风mic1.
2. 创建麦克风mic2;mic1将派出Microphone.UNAVAILABLE状态事件。
使用案例 3
1. 创建增强的麦克风mic1.
2. 增强的麦克风mic2创建具有一个不同的设备;mic1将派出Microphone.UNAVAILABLE状态事
件。
使用案例 4
1. 创建麦克风mic1.
2. 麦克风mic2创建具有一个不同的设备;mic1和mic2提供的音频数据。
示例应用程序
为前一条,开发了一种示例实时协作应用程序使用Adobe 卷云。
我已经更新此应用程序以使用新推出的增强型音频Api。
我创建了一个中央的函数获得一个麦克风:
private function getMicrophone():Microphone
{
if (enhancedCheckbox.selected)
{
return Microphone.getEnhancedMicrophone(micIndex);
}
else
{
return Microphone.getMicrophone(micIndex);
}
}
在此函数中,micIndex是存储用户所选的麦克风索引变量,enhancedCheckbox是指控制增强的麦克风选择Flex 火花复选框组件。
原文查看。