2012-11-21 9 views
8

AudioRecordクラスを使っていくつか問題があります。私はバッファに記録されたデータを保存したいが、私はそれを達成するための適切な方法がわからない。私は多数の例を見てきましたが、それらの大部分は複雑で多くの異なるアプローチを表していました。私は単純なものか簡単なものかを探しています。ここでAudioRecord - データをバッファに入れる方法は?

は私のプロジェクトのための私のオーディオの設定です:

int audioSource = AudioSource.MIC; 
int sampleRateInHz = 8000; 
int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 

short[] buffer = new short[bufferSizeInBytes]; 

AudioRecord audioRecorder = new AudioRecord(audioSource, 
              sampleRateInHz, 
              channelConfig, 
              audioFormat, 
              bufferSizeInBytes); 

私は 'レコーディング機能を作成しようとは:m

public void Recording() { 
    audioRecorder.startRecording(); 
    ... 
    audioRecorder.stop(); 
    audioRecorder.release(); 
} 

私は私がいることを知っている' .read使用することになっM(短いです[] audioData、int offsetInShorts、int sizeInShorts)関数です。そしてここで私の問題が始まります。私は、どのようにaudioDataバッファが動作するのかわかりません - 私は関数がオーディオデータに記録されたサンプルを置くと仮定します。データがいっぱいになるとどうなりますか?それは最も早い位置から書き直しを開始しますか?もしそうなら、収集したすべてのサンプルを他の場所にコピーする必要があると私は信じています。もう一つの疑問が浮かび上がっています - .read(...)関数のバッファがすでにいっぱいであるかどうかをどうやって確認できますか?時間を測定してバッファの内容をコピーする必要がありますか、それを達成する別の方法がありますか?また、録音操作全体のスレッドを作成する必要がありますか?ご質問

1つのトピックで非常に多くの質問をするために申し訳ありません:)

答えて

3

回答::

recorder.read(...)は、必ずしもすべてですべてのデータを読み取ることはありません。おそらく、ループを書き換えて、読み込みの間の短い間(たとえば、50ms)ポーズしてください。また、バッファにデータがあるまでバッファをキューに入れてはいけません。また、バッファーがいっぱいではないかもしれないので、おそらく、バイト数のカウントを維持するデータ構造を使用する必要があります。 ByteBufferは良い候補者として気になります。読み込みループでバイトを埋めることができます。十分にいっぱいになったら、転送用にキューに入れて別のバイトを開始します。

オフコースをループするためにスレッドを作成する必要があります。以下のコードに示すように。

適切なエラーチェックを行うレコーディングループの修正バージョンです。もちろん

private void startRecording() { 

    recorder.startRecording(); 
    isRecording = true; 
    recordingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      bData = ByteBuffer.allocate(BufferElements); 
      bbarray = new byte[bData.remaining()]; 
      bData.get(bbarray); 
      while (isRecording) { 

       int result = recorder.read(bbarray, 0, BufferElements); 
       System.out.println("READ DATA"); 
       if (result > 0) { 
        qArray.add(bData); 

        --your stuffs-- 
        bData = ByteBuffer.allocate(BufferElements); 
       } else if (result == AudioRecord.ERROR_INVALID_OPERATION) { 
        Log.e("Recording", "Invalid operation error"); 
        break; 
       } else if (result == AudioRecord.ERROR_BAD_VALUE) { 
        Log.e("Recording", "Bad value error"); 
        break; 
       } else if (result == AudioRecord.ERROR) { 
        Log.e("Recording", "Unknown error"); 
        break; 
       } 
       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        break; 
       } 
      } 
     } 
    }, "AudioRecorder Thread"); 
    recordingThread.start(); 
} 

、どこかにあなたがrecorder.startRecording()を呼び出す必要がありますまたはあなたが任意のデータを取得することはありません:それはQueue<ByteBuffer>代わりQueue<byte[]>で使用しています。

作業サンプルの外観at this example

+0

** qArray **は何ですか? – OnePunchMan

+0

はarraylistかもしれません。私は今覚えていない。この例を参考にしてください。http://stackoverflow.com/questions/8499042/android-audiorecord-example/13487250#13487250 –

関連する問題