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