Frecuencia de muestreo y ruido de Android MediaRecorder

Tengo un problema usando el MediaRecorder de Android para grabar sonido de micrófono a archivos .m4a (AAC-LC, contenedor MPEG-4). A partir del nivel 18 de la API, la velocidad de muestreo por defecto disminuye de 44,1 ó 48 kHz (dependiendo del dispositivo) a sólo 8 Hz. Si especifico la frecuencia de muestreo usando MediaRecorder.setAudioSamplingRate, utiliza la velocidad especificada pero hay un montón de ruido extraño en la grabación.

En LogCat, la siguiente advertencia está ocurriendo de vez en cuando:

(1) Etiqueta: AudioSource Texto: AudioRecord informó sobrecarga

(2) Etiqueta: AudioFlinger Texto: RecordThread: buffer overflow

Aquí está el código:

MediaRecorder recorder = new MediaRecorder(); recorder.setAudioChannels(2); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setAudioSamplingRate(48000); // if not specified, defaults to 8kHz, if specified 44.1 or 48 kHz, lots of noise recorder.setOutputFile("test.m4a"); try { recorder.prepare(); recorder.start(); } catch (IOException ioe) { Log.e(TAG, "IOException", ioe); } catch (IllegalStateException ise) { Log.e(TAG, "IllegalStateException", ise); } catch (Exception e) { Log.e(TAG, "Exception", e); } 

Cualquier ayuda es muy apreciada.

Puede configurar SamplingRate (como lo ha hecho) y EncodingBitRate, que ha omitido.

He podido lograr grabaciones de muy alta calidad usando lo siguiente:

  mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC); mRecorder.setAudioSamplingRate(48000); mRecorder.setAudioEncodingBitRate(384000); 

Esto codificará con 8 bits por muestra, que es probablemente más allá de la calidad disponible del micrófono en la mayoría de los dispositivos.

Después de una larga investigación y trata, esta es la mejor solución de trabajo que hice:

 mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mRecorder.setAudioEncodingBitRate(384000); mRecorder.setAudioSamplingRate(44100); 
  • Servicio de grabación / procesamiento de llamadas! - Android
  • ¿Por qué Camera necesita ser lanzado en onPause () en lugar de onstop () método de Activity?
  • Dividir y combinar / grabar audio grabado
  • Android getSupportedVideoSizes siempre devuelve null
  • MediaRecorder start () falla si se llama demasiado rápido
  • MediaRecorder setVideoSize muestra un comportamiento diferente en diferentes dispositivos
  • La clase MediaRecorder comienza a grabar audio después de un ligero retraso
  • MediaRecorder.start () lanzando IllegalStateException
  • Captura de video de MediaRecorder en modo retrato
  • Cómo grabar el video usando la vista previa de la cámara en TextureView
  • Android MediaRecorder en streaming
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.