5

現在、Androidデバイスでオーディオをテストするためのループバックプログラムがあります。

AudioRecordとAudioTrackを使用して、マイクからのPCMオーディオを録音し、イヤピースからPCMオーディオを再生します。

コードは次のとおりです。

public class Record extends Thread
  {

          static final int bufferSize = 200000;
          final short[] buffer = new short[bufferSize];
          short[] readBuffer = new short[bufferSize];

          public void run() {  
            isRecording = true;
            android.os.Process.setThreadPriority
            (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

            int buffersize = AudioRecord.getMinBufferSize(11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

                           arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize);

                           atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize,
                                           AudioTrack.MODE_STREAM);


                           atrack.setPlaybackRate(11025);

                           byte[] buffer = new byte[buffersize];
                           arec.startRecording();
                           atrack.play();

                           while(isRecording) {

                                   arec.read(buffer, 0, buffersize);
                                   atrack.write(buffer, 0, buffer.length);
                           }  
          }
  }

したがって、AudioTrackとAudioRecordの作成でわかるように、エンコーディングはAudioFormatを介して提供されますが、これでは16ビットまたは8ビットのPCMしか使用できません。

現在、独自のG711コーデックを実装しており、マイクからのオーディオをエンコードして、EarPieceにデコードできるようにしたいので、encode(short lin []、int offset、byte enc []、int frame)を使用します。およびdecode(byte enc []、short lin []、int frame)メソッドですが、これらを使用してAudioRecordおよびAudioTrackからのオーディオをエンコードおよびデコードする方法がわかりません。

誰かが私を助けたり、正しい方向に向けたりできますか?

4

2 に答える 2

2

からのメソッドarec.read(buffer, 0, buffersize)を使用するように呼び出しを変更します。Bytebuffer read()AudioRecord

バイトをByteBufferオブジェクトに入れたら、encodeのG711実装呼び出しを挿入し、このByteBuffer.asShortBuffer()メソッドを使用して、キャプチャしたPCMデータをエンコーダに取り込むことができます。

それはあなたのためにその仕事をするためにサードパーティのライブラリを導入する必要なしにあなたの最初の質問を解決するでしょう。(この答えは、質問に出くわす将来の人々のためのものです)。

私の質問はなぜですか?

上記のコードでは、マイクからPCMデータをキャプチャし、それをバッファに直接書き込んで再生します。

実装では、PCM-> G711(エンコード)-> G711(デコード)->PCMのパスをたどることは意味がありません。あなたがしているのは、不必要な処理と待ち時間を導入することだけです。さて、イヤピースを通して再生しようとするのではなく、エンコードされたデータをファイルに書き込む場合、それは別の話になりますが、現在のコードはPCMデータをエンコードするのに実際には役に立たないようです。

ここで独自のコーデックを導入することは、圧縮された音声データをファイルに書き込む(たとえば、圧縮された方法で通話データを記録する)か、ネットワークなどを介して送信する場合にのみ意味があります。

于 2013-04-20T16:19:55.033 に答える
0

これはかなり古い投稿だと思います。独自のG711を機能させることができましたか?私自身の最初の考えは、カーネル用にコンパイルされたlibを使用し、JNIを使​​用してそれを呼び出すことでした。

于 2012-09-18T16:58:56.250 に答える