1

我刚刚尝试了下面的代码,它可以很好地减少耳机上的回声。但是回声问题仍然存在,就像在扬声器的情况下一样。

  public var intCountMilliSec:int = 0;
  public var intLastActivityLevel:int = 0;

  public var intLastLowestActivityLevel:int = 100;//07-Dec-09

  private function CancelEcho(e:TimerEvent):void
  {
      intCountMilliSec = intCountMilliSec + 50;
      if (Red5OutgoingMic.activityLevel > intLastActivityLevel)
      {
          intLastActivityLevel = Red5OutgoingMic.activityLevel;
      }

      if (Red5OutgoingMic.activityLevel < intLastLowestActivityLevel)
      {
          intLastLowestActivityLevel = Red5OutgoingMic.activityLevel;
      }

      if (intCountMilliSec >= 1500)
      {
          if (intLastActivityLevel > 20)
          {
              Red5OutgoingMic.gain *= 0.8; 
          }
          if (intLastLowestActivityLevel < 20)
          {
              if (Red5OutgoingMic.gain <= 30)
              {
                  Red5OutgoingMic.gain = Red5OutgoingMic.gain/0.8;
              }
          }

          intCountMilliSec = 0;
          intLastActivityLevel = 0;

          intLastLowestActivityLevel = 0;
      }
  }

任何即时帮助表示赞赏。

4

2 回答 2

0

您的体验称为反馈,这是一个硬件问题,麦克风会拾取扬声器发出的声音并通过扬声器再次播放。

通常它会发出尖叫声,但由于超过 ip 的延迟,它只能回收声音。这是一个常见的问题。

耳机是一种常见的解决方案。另一种解决方案是将音频输出从音频输入移开:即将扬声器从麦克风移开。

见:http ://en.wikipedia.org/wiki/Audio_feedback

于 2009-12-07T15:11:22.420 回答
0

您正在寻找的解决方案称为回声消除。不幸的是,今天只有两种选择:

1) 在 Flash 中进行回声消除。Adobe 有能力在 Flash 中嵌入此功能,但不幸的是,他们只允许在针对 Adob​​e Connect 的会议服务器运行时使用它。蹩脚,但真实。

2)您的另一个选择是解码来自服务器中所有参与者的音频,在那里混合音频,并使用回声消除库删除回声。执行此操作的 C 库的一个示例是 spandsp,但这需要大量额外代码,以及可以从 Flash 解码的媒体服务器。Red5 开源服务器可以接收来自 Flash 的音视频,您可以使用 Xuggle 库将音频解码为原始音频。不过,移除回声需要与正确的回声消除库集成。

简而言之,除非 Adob​​e 决定在 Flash 中为非 Adob​​e 专有应用程序实际启用回声消除,否则您将面临解决问题的艰难道路(即,目前无法通过 ActionScript 解决此问题)。

希望有帮助。

  • 艺术
于 2009-12-11T22:26:17.850 回答