3

Android APIのAudioRecordクラスを使用してオーディオキャプチャアプリケーションを開発しようとしています.MediaRecorder.AudioSource.MICのオーディオソースを設定しますが、エコーキャンセルを使用しようとするとMediaRecorder.AudioSource.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"

おそらく、私は Samsung Galaxy Tab p1000 を使用していて、Android 2.2 で実行されているためでしょうか? 何か案が?

どうもありがとう

4

2 に答える 2

6

Arm5 (WM8650) プロセッサでエコー キャンセレーションを機能させることができました。以下は私が取った手順です。

  1. Speex を JNI でラップし、PCM フレームをエンコーダーに送信する前にエコー処理ルーチンを呼び出しました。Speexの設定を試してもエコーはキャンセルされませんでした。

  2. Speex は再生フレームとエコー フレームの間の遅延に非常に敏感であるため、キューを実装し、AudioTrack に送信されるすべてのパケットをキューに入れました。キューのサイズは、内部 AudioTrack バッファーのサイズとほぼ同じにする必要があります。この方法では、AudioTrack がパケットを内部バッファからサウンド カードに送信するのとほぼ同時に、パケットが echo_playback に送信されます。このアプローチで遅延は解消されましたが、エコーはまだキャンセルされませんでした

  3. WebRtc エコー キャンセル部分を JNI でラップし、パケットをエンコーダーに送信する前にそのメソッドを呼び出しました。エコーはまだ存在していましたが、ライブラリは明らかにそれをキャンセルしようとしていました.

  4. P2 で説明したバッファー手法を適用したところ、ようやく機能し始めました。ただし、遅延はデバイスごとに調整する必要があります。また、WebRtc にはエコー キャンセレーションのモバイル バージョンとフル バージョンがあることにも注意してください。フルバージョンではプロセッサが大幅に遅くなるため、おそらく ARM7 でのみ実行する必要があります。モバイル版は動作しますが、品質が低下します

これが誰かを助けることを願っています。

于 2011-08-19T16:49:09.223 に答える
2

はい、そうです。問題は、Android 2.2 を使用していることです。新しい VOICE_COMMUNICATION は Android 3.0 で導入されました。古いバージョンで実行すると、代わりに DEFAULT ソースが取得されます。

于 2011-06-01T09:30:44.423 に答える