我正在尝试使用 Adobe Flex 构建视频聊天程序,但回声存在巨大问题。如果参与者不使用耳机,他们所说的一切都会回声。更糟糕的是,它们实际上可以创建回声的正反馈循环,直到麦克风静音才会结束。
有没有人在 Flex/Flash 平台上找到了解决方案?
我的软件使用的是 Speex 编解码器,我已尽我所能消除所有缓冲(即它是一个实时流,我将缓冲长度设置为 0)。环回选项关闭,“使用回声抑制”打开。我正在使用Red5服务器进行视频和音频流传输。
任何帮助,将不胜感激。
我正在尝试使用 Adobe Flex 构建视频聊天程序,但回声存在巨大问题。如果参与者不使用耳机,他们所说的一切都会回声。更糟糕的是,它们实际上可以创建回声的正反馈循环,直到麦克风静音才会结束。
有没有人在 Flex/Flash 平台上找到了解决方案?
我的软件使用的是 Speex 编解码器,我已尽我所能消除所有缓冲(即它是一个实时流,我将缓冲长度设置为 0)。环回选项关闭,“使用回声抑制”打开。我正在使用Red5服务器进行视频和音频流传输。
任何帮助,将不胜感激。
这是 Adobe 软件中的一个已知问题,目前尚无修复程序。
现在你只能解决这个问题。
您应该在应用程序中实现一键通模式,并让用户在遇到音质问题时可以轻松切换到一键通。
如果应用程序的所有用户都有耳机,那么他们就不必求助于Push-to-Talk。
如果您的应用程序正在进行多对多会议,那么允许用户请求发言者令牌可能是一个有趣的想法。
使用基于tst建议的方法,可以让应用程序检查哪些人在说话,然后自动授予扬声器令牌,而不是让用户手动请求它。显然,必须进行可用性测试以确保这在实践中运作良好。
有关该错误的更多信息
您可以参考以下 Adobe 错误报告了解更多详细信息:
错误描述如下:
Flash 播放器尚不支持 AEC。Flash player 10 beta 也没有 AEC 支持。开发人员需要内置 AEC 来创建方便的 Web 服务,并提供实时音频/视频通信,而无需用户佩戴耳机。根据 Speex 项目网站,Speex 支持 AEC。请为 Flash Player 10 的发布版本添加 AEC 支持,以使其适合通信 web 服务。
您需要实施一些过滤,以确保扬声器的所有输出都从麦克风输入中消除(或尽可能接近)。我不知道执行此操作的具体工具,但基本思想是您获取输入和输出的并行时间片,然后从输入中减去输出的波形。由于延迟,您可能必须引入偏移量以使事情匹配。
我在网络会议系统中遇到了同样的问题,但在网络上找不到任何解决方案。据我了解,“使用回声抑制”将仅取消由环回产生的回声。但我提出了一个简单的解决方案——并不完美,但总比没有好:
every 50ms check Microphone.activityLevel
if during last 1500ms activityLevel was greater than 20
then Microphone.gain *= 0.8
您也可以通过低通滤波器传递流以减少回声
另一个部分解决方案是在输入电平低于某个阈值时停止发送。这样,一旦有人停止说话,回声就会消失。
您可以尝试使用卷积滤波器,它会尝试将麦克风输入与您发送到扬声器的最近输出相关联。当您检测到麦克风输入与最近的输出相似时,只需将麦克风静音,直到相关性消失。(但 IANAX,我不是专家)
1)您应该定义问题 - 如果在没有人说话时发生这种情况,在扬声器听到声音之后,或者只有当很多人同时说话时等等......
2)请注意,与大多数软件问题不同,在该领域中,没有一种解决方案可以 100% 有效,而是解决方案由多种方法组成,并且通常效果很好,但并非一直有效。
因此,您应该实现上面的一些想法,将我的想法添加到这个受人尊敬的列表中:
a) 首先调整录音、增益等的电平...
b) 尝试插入从样本录制到播放时间的延迟。为了计算延迟,使用了尝试和错误的方法。
c) 你有均衡器吗?调整它 - 有时问题出在单个频率范围内,可能是低电平的......
如果你的努力没有奏效,问题更严重,你需要在 Flex 中找到,或者实现某种“回声消除”,这可以简单或聪明地完成,我确信有开放来源一些地方。