5

我正在尝试使用 Adob​​e Flex 构建视频聊天程序,但回声存在巨大问题。如果参与者不使用耳机,他们所说的一切都会回声。更糟糕的是,它们实际上可以创建回声的正反馈循环,直到麦克风静音才会结束。

有没有人在 Flex/Flash 平台上找到了解决方案?

我的软件使用的是 Speex 编解码器,我已尽我所能消除所有缓冲(即它是一个实时流,我将缓冲长度设置为 0)。环回选项关闭,“使用回声抑制”打开。我正在使用Red5服务器进行视频和音频流传输。

任何帮助,将不胜感激。

4

8 回答 8

7

这是 Adob​​e 软件中的一个已知问题,目前尚无修复程序。

现在你只能解决这个问题。

您应该在应用程序中实现一键通模式,并让用户在遇到音质问题时可以轻松切换到一键通。

如果应用程序的所有用户都有耳机,那么他们就不必求助于Push-to-Talk

如果您的应用程序正在进行多对多会议,那么允许用户请求发言者令牌可能是一个有趣的想法。

使用基于tst建议的方法,可以让应用程序检查哪些人在说话,然后自动授予扬声器令牌,而不是让用户手动请求它。显然,必须进行可用性测试以确保这在实践中运作良好。

有关该错误的更多信息

您可以参考以下 Adob​​e 错误报告了解更多详细信息:

错误描述如下:

Flash 播放器尚不支持 AEC。Flash player 10 beta 也没有 AEC 支持。开发人员需要内置 AEC 来创建方便的 Web 服务,并提供实时音频/视频通信,而无需用户佩戴耳机。根据 Speex 项目网站,Speex 支持 AEC。请为 Flash Player 10 的发布版本添加 AEC 支持,以使其适合通信 web 服务。

于 2009-03-11T13:03:31.030 回答
4

您需要实施一些过滤,以确保扬声器的所有输出都从麦克风输入中消除(或尽可能接近)。我不知道执行此操作的具体工具,但基本思想是您获取输入和输出的并行时间片,然后从输入中减去输出的波形。由于延迟,您可能必须引入偏移量以使事情匹配。

于 2009-02-26T19:59:03.557 回答
3

我在网络会议系统中遇到了同样的问题,但在网络上找不到任何解决方案。据我了解,“使用回声抑制”将仅取消由环回产生的回声。但我提出了一个简单的解决方案——并不完美,但总比没有好:

every 50ms check Microphone.activityLevel

if during last 1500ms activityLevel was greater than 20
then Microphone.gain *= 0.8
于 2009-03-06T09:43:37.447 回答
1

您也可以通过低通滤波器传递流以减少回声

于 2009-03-06T09:42:12.880 回答
1

另一个部分解决方案是在输入电平低于某个阈值时停止发送。这样,一旦有人停止说话,回声就会消失。

于 2009-03-09T00:46:40.600 回答
1

您可以尝试使用卷积滤波器,它会尝试将麦克风输入与您发送到扬声器的最近输出相关联。当您检测到麦克风输入与最近的输出相似时,只需将麦克风静音,直到相关性消失。(但 IANAX,我不是专家)

于 2009-03-09T19:55:54.737 回答
0

1)您应该定义问题 - 如果在没有人说话时发生这种情况,在扬声器听到声音之后,或者只有当很多人同时说话时等等......

2)请注意,与大多数软件问题不同,在该领域中,没有一种解决方案可以 100% 有效,而是解决方案由多种方法组成,并且通常效果很好,但并非一直有效。

因此,您应该实现上面的一些想法,将我的想法添加到这个受人尊敬的列表中:

a) 首先调整录音、增益等的电平...

b) 尝试插入从样本录制到播放时间的延迟。为了计算延迟,使用了尝试和错误的方法。

c) 你有均衡器吗?调整它 - 有时问题出在单个频率范围内,可能是低电平的......

如果你的努力没有奏效,问题更严重,你需要在 Flex 中找到,或者实现某种“回声消除”,这可以简单或聪明地完成,我确信有开放来源一些地方。

于 2009-03-10T09:58:20.407 回答
0

我的妻子做了一个关于回声消除的自适应冷杉滤波的硕士项目。只要你知道一个来源,它似乎就能够管理可变延迟,你知道。尽管对于您的应用程序来说,这似乎有点过头了。查看有关自适应滤波器fir 滤波器和 matlab 中的 wolfram fir 滤波器代码的维基百科页面作为起点。

于 2009-03-12T02:39:10.427 回答