【问题标题】:Android echo cancellationAndroid 回声消除
【发布时间】:2011-08-31 01:53:39
【问题描述】:

我正在尝试使用 AudioRecord 开发音频捕获应用程序 来自android api的类,设置,音频源如何 MediaRecorder.AudioSource.MIC,该应用程序有效,但是当我尝试使用时 回声消除,设置一个 MediaRecorder.AudioSource.VOICE_COMMUNICATION 如何来源,当 AudioRecorder 对象是 创建后,抛出 IllegalArgumentException,但我不知道为什么:

我的代码是:

private static final int SAMPLE_RATE = 16000;
private static final int BIT_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private static final int CHANNEL_CONFIGURATION = AudioFormat.CHANNEL_CONFIGURATION_MONO;

private int m_i32BufferSize;

private AudioRecord m_AudioRecorder;

public caudioCapture ()
{
    super ();

    m_i32BufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIGURATION, BIT_ENCODING);

    //Create audio recorder object 
    try
    {
        m_AudioRecorder = new AudioRecord (MediaRecorder.AudioSource.VOICE_COMMUNICATION,SAMPLE_RATE,CHANNEL_CONFIGURATION,BIT_ENCODING,m_i32BufferSize);

    }
    catch (IllegalArgumentException e)
    {
        throw new IllegalArgumentException("Bad arguments on AudioRecorder creation", e);
    }

在我的 android 清单中,我有:

使用权限 android:name="android.permission.RECORD_AUDIO"

也许是因为我使用的是三星 Galaxy Tab p1000 并且它运行的是 android 2.2?有什么想法吗?

非常感谢

【问题讨论】:

    标签: android audio echo cancellation


    【解决方案1】:

    我终于能够在我的 Arm5 (WM8650) 处理器上使用回声消除功能。以下是我采取的步骤。

    1. 我用 JNI 封装了 Speex,并在将 PCM 帧发送到编码器之前调用了回声处理例程。无论我尝试什么 Speex 设置,都没有取消回声。

    2. 因为 Speex 对播放和回显帧之间的延迟非常敏感,所以我实现了一个队列并将所有发送到 AudioTrack 的数据包排队。队列的大小应该大致等于内部 AudioTrack 缓冲区的大小。当 AudioTrack 将数据包从其内部缓冲区发送到声卡时,这种方式数据包被发送到 echo_playback。使用这种方法消除了延迟,但仍然没有取消回显

    3. 我用 JNI 封装了 WebRtc 回声消除部分,并在将数据包发送到编码器之前调用了它的方法。回声仍然存在,但图书馆显然试图取消它。

    4. 我应用了 P2 中描述的缓冲技术,它终于开始工作了。但是,需要为每个设备调整延迟。另请注意,WebRtc 具有移动版和完整版回声消除功能。完整版大大减慢了处理器的速度,应该只能在 ARM7 上运行。移动版可以运行,但质量较低

    我希望这会对某人有所帮助。

    【讨论】:

    • 嗨。你能在这里分享你的jni代码吗?我也在使用 speex 并得到很多回声。
    【解决方案2】:

    是的,这是正确的。问题是您使用的是 Android 2.2。 Android 3.0 中引入了新的 VOICE_COMMUNICATION。在旧版本上运行时,您将获得 DEFAULT 源代码。

    【讨论】:

    • 您好 Joakim,但是,默认源具有回声消除功能?因为我需要它,而且如果我使用设备的回声消除器,对我来说更好。我知道,例如 Skype,在 android 2.2 中有回声消除,但我不知道他们是否实现了自己的消除器或使用了一些设备问题
    • 不,默认没有。如果您在 3.0 之前需要回声消除,您需要自己做。我建议您查看 Speex。它有一个有效的回声消除实现。它是本机代码,因此您需要通过 JNI 调用它。
    • 好吧,我使用过 Speex 和回声消除它非常昂贵,关于 cpu 资源,所以,我想我会尝试使用已发布的 Skype 代码,但是,我不知道是否此编解码器实现取消。
    • 我对 android 3.0 的内置回声消除感到非常失望。我在应用程序中添加了开关,以便可以打开和关闭它,结果很明显,但仍然远远不够。我只用一部手机(运行 Cyanogen 10 的三星 Vibrant)测试了它,所以 YMMV。
    猜你喜欢
    • 2020-10-10
    • 2012-04-22
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多