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.
- Cómo ajustar la sensibilidad del micrófono mientras graba audio en android
- PCM -> AAC (Encoder) -> PCM (Decodificador) en tiempo real con optimización correcta
- Mala calidad de sonido al grabar / reproducir sonidos - SDK de Android
- Escritura de datos grabados PCM en un archivo .wav (java android)
- AudioFlinger no pudo crear pista de grabación, estado: -1, Necesita ayuda para ifx
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?
- ¿Cómo ajustar la frecuencia de muestreo de audio superior a 44.1kHz en la plataforma linux / android?
- AudioRecord registra sonido intermitente en Android L Vista previa del desarrollador
- Creación de un archivo WAV a partir de datos PCM sin procesar utilizando el SDK de Android
- Android Emulator parece grabar audio a 96kHz
- Android AudioRecord leer siempre devuelve -3 (ERROR_INVALID_OPERATION)
- AudioRecord y AudioTrack latency
- Errores al grabar sonido en Android
- ¿Por qué recibiría NPE en este estado?
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