Android回音取消

时间:2011-05-23 11:02:16

标签: android audio echo cancellation

我正在尝试使用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清单中,我有:

uses-permission android:name =“android.permission.RECORD_AUDIO”

也许是因为我使用的是三星galaxy tab p1000并且它与Android 2.2一起运行?有什么想法吗?

非常感谢

2 个答案:

答案 0 :(得分:6)

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

  1. 我将Speex与JNI包装在一起,并在将PCM帧发送到编码器之前调用了回显处理例程。无论我尝试过何种Speex设置,都没有取消回音。

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

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

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

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

答案 1 :(得分:1)

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