AudioRecord: ¿Desbordamiento del búfer?

Estoy recibiendo desbordamiento de búfer mientras RECORDING con mi aplicación. La grabación se realiza en un Service . No pude averiguar por qué estoy recibiendo este mensaje de AudioFlinger .

A continuación, instanciar el objeto AudioRecord y establecer sus devoluciones de llamada.

 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]; 

La devolución de llamada 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) {} }; 

Sospecho que el problema está relacionado con: aRecorder.setPositionNotificationPeriod(framePeriod); – tal vez el período es demasiado grande para este bufferSiz y un período más rápido (más pequeño) resolverá el problema.

¿Podría alguien decirme cómo deshacerse del desbordamiento del búfer?

Para solucionar este problema, cambie el tamaño del búfer de AudioRecord a 2 veces el tamaño de búfer mínimo.

Puede utilizar el método estático AudioRecord.getMinBufferSize() . Esto le dará el tamaño de búfer mínimo para usar para su formato actual.

La sintaxis del método getMinBufferSize () es:

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

Cualquier cosa menos que este número resultará en un fallo al crear el objeto AudioRecord.

Debería haber reducido el tamaño del búfer, para no sobrecargar el subsistema de audio con demandas de datos.

Recuerde poner los métodos sobreescritos ( @Override ) para la devolución de llamada audioRecord de la siguiente manera:

 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) {} }; 

Recomiendo leer el post: Android grabación de audio, parte 2

Una cosa más que puedes intentar es usar roscas en la grabación y el otro proceso en los bytes grabados, evitando así demasiada sobrecarga en el hilo principal de la interfaz de usuario.

El código de código fuente abierto para este enfoque: musicg_android_demo

Compruebe esta publicación para obtener más información – android-audiorecord-class-process-live-mic-audio-quick-set-up-callback-func

Eso es porque :

 framePeriod = bufferSize / bytesPerFrame; 

Necesitas multiplicar y no dividir tu buffersize.

Prueba con:

 framePeriod = bufferSize * bytesPerFrame; 

Y si necesita un ejemplo: aquí hay una clase completa de captura de audio

Espero eso ayude

  • Cancelación de ruido activo de Android
  • AudioRecord: inicio () estado -38
  • Codificador AAC de Android MediaCodec
  • ¿Puede Android Emulator recoger audio?
  • Android AudioRecord clase - proceso de mic audio en vivo rápidamente, configurar la función de devolución de llamada
  • Emitir codificación y decodificación de una grabación de audio al formato G711 (PCMU - uLaw)
  • Android: Necesidad de registrar la entrada de micrófono
  • Android AudioRecord ejemplo
  • La inicialización de Android AudioRecord falla cada vez
  • AudioRecord de Android vs MediaRecorder para la grabación de audio
  • Android grabación y reproducción + altavoz como una opción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.