3

我正在尝试使用来自android api的AudioRecord类开发音频捕获应用程序,设置音频源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?任何的想法?

非常感谢

4

2 回答 2

6

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

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

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

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

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

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

于 2011-08-19T16:49:09.223 回答
2

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

于 2011-06-01T09:30:44.423 回答