Android 安卓回音消除

Android 安卓回音消除,android,audio,echo,cancellation,Android,Audio,Echo,Cancellation,我正在尝试使用AudioRecord开发一个音频捕获应用程序 来自android api的类,设置,如何使用音频源 MediaRecorder.AudioSource.MIC,应用程序正常,但当我尝试使用 回声消除,设置一个 MediaRecorder.AudioSource.VOICE\当AudioRecorder对象为 创建时,会抛出一个IllegalArgumentException,但我不知道为什么: 我的代码是: private static final int SAMPLE_RATE

我正在尝试使用AudioRecord开发一个音频捕获应用程序 来自android api的类,设置,如何使用音频源 MediaRecorder.AudioSource.MIC,应用程序正常,但当我尝试使用 回声消除,设置一个 MediaRecorder.AudioSource.VOICE\当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\u AUDIO”

也许是因为我使用的是三星galaxy tab p1000,它运行的是安卓2.2?有什么想法吗


非常感谢

是的,这是正确的。问题是你使用的是安卓2.2。Android 3.0引入了新的语音通信。在旧版本上运行时,您将获得默认源。

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

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

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

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

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


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

    你好,Joakim,但是,默认源有回声消除功能吗?因为我需要它,如果我使用设备的回声消除器,对我来说更好。我知道,例如skype,android 2.2中有回声消除功能,但我不知道他们是否实现了自己的取消器或使用了一些deviceNo的问题,默认情况下没有。如果你需要在3.0之前取消回音,你需要自己去做。我建议你调查一下Speex。它有一个有效的回音消除实现。这是本机代码,所以你需要通过JNI调用它。好吧,我已经使用过Speex和回音消除。它非常昂贵,涉及cpu资源,所以,我想我会尝试使用发布的skype代码,但是,我不知道这个编解码器是否实现了回音消除。我对android 3.0的内置回音消除非常失望。我在一个应用程序中添加了开关,这样我就可以打开和关闭它,结果是显而易见的,但这还远远不够。我只在一部手机上测试过它(三星Vibrant运行Cynogen 10),所以YMMV.hi。你能在这里分享你的jni代码吗。我也在使用speex,收到了很多回音。