2013-07-22 21 views
6

私のアプリでRECORDINGの間にバッファオーバーフローが発生しています。記録は、Serviceで行われる。私はなぜこのメッセージをAudioFlingerから得ているのか分かりませんでした。AudioRecord:バッファオーバーフロー?

以下、AudioRecordオブジェクトをインスタンス化し、そのコールバックを設定します。

bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); 
aRecorder = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize); 

aRecorder.setRecordPositionUpdateListener(updateListener); 

bytesPerSample = bitsPerSample/8; 
int bytesPerFrame = nChannels * bytesPerSample; 
framePeriod = bufferSize/bytesPerFrame; // nr of frames that can be kept in a bufferSize dimension  
int result = aRecorder.setPositionNotificationPeriod(framePeriod);  
buffer = new byte[bufferSize]; 

audiorecordのコールバック:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){ 
     public void onPeriodicNotification(AudioRecord recorder){ 
      int result = aRecorder.read(buffer, 0, buffer.length); 
     } 

     public void onMarkerReached(AudioRecord recorder) 
     {} 
    }; 

私は、問題が関連する疑いがある:aRecorder.setPositionNotificationPeriod(framePeriod); - 多分期間は、このbufferSiz Eの大きすぎると高速(小さい方)の期間は、問題を解決します。

誰かにバッファオーバーフローを取り除く方法を教えてもらえますか?

答えて

8

を役に立てば幸いサイズ。

AudioRecord.getMinBufferSize()静的メソッドを使用できます。これにより、現在のフォーマットに使用する最小バッファサイズが与えられます。

getMinBufferSize()メソッドの構文は次のとおりです

public static int getMinBufferSize (
    int sampleRateInHz, int channelConfig, int audioFormat) 

audiorecordのオブジェクトを作成しながら、この数は故障につながる未満何か。

データの要求に応じてオーディオサブシステムを圧倒しないように、バッファサイズを小さくしてください。

は、次のようにaudiorecordのコールバックのためにオーバーライドされたメソッド(@Override)を置くことを忘れないでください:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){ 

     @Override 
     public void onPeriodicNotification(AudioRecord recorder){ 
      int result = aRecorder.read(buffer, 0, buffer.length); 
     } 

     @Override 
     public void onMarkerReached(AudioRecord recorder) 
     {} 
    }; 

私はポストを読むことをお勧めします:あなたが試みることができるAndroid audio recording, part 2

もう一つは、上のスレッドを使用することです記録されたバイト上の他の処理が行われ、メインのUIスレッドで過度のオーバーロードが回避されます。

このアプローチのためのオープンソースのサンプルコード: - android-audiorecord-class-process-live-mic-audio-quickly-set-up-callback-func

+0

あなたの答えをありがとう、すべてのデータ処理は、セカンダリスレッドで行われます。 bufferSizeは、AudioRecord(getMinBufSize)の静的メソッドを使用して取得されます。 @overwriteは本当に欠けていました。 –

+0

と私は昨日minBufSizeに2を掛けようとしましたが、 "BufferOverlow" msgの頻度を〜30秒に減らしていました。とにかく、2を乗算することは今まで私が試した最良の変種でしたが、私は1:3時間後に録音が止まるので完全に取り除きたいと思います。 –

+0

これは、2を掛けた後に、バッファオーバーフローの問題はありませんが、一定の時間が経過すると録画が停止することを意味していますか?レコーダーをリセットする前に、リセットすることができます。 –

1

ザッツので:あなたのBUFFERSIZEを分割乗算しないようにする必要があります

framePeriod = bufferSize/bytesPerFrame; 

で試してみてください:

framePeriod = bufferSize * bytesPerFrame; 

そして、あなたはサンプルが必要な場合:here is a complete audio capture class

が、それは2倍の最小バッファにaudiorecordののバッファサイズを変更すると、その問題を解決するには

+0

おかげmusicg_android_demo

は、より多くのために、この記事をチェックしてください。バッファは、次のようにインスタンス化する必要があります。buffer = new byte [framePeriod * bytesPerFrame]? –

+0

私はあなたが提供したリンクに従おうとします。私はそれがコールバックバリアント(onPeriodicNotification)の代わりに記録するセカンダリスレッドを使用して見た –

関連する問題