Android AudioRecord soportó las tasas de muestreo

Estoy intentando averiguar qué frecuencias de muestreo son compatibles con teléfonos con Android 2.2 y versiones posteriores. Nos gustaría muestrear a una velocidad inferior a 44.1 kHz y no tener que volver a muestrear.
Sé que todos los teléfonos son compatibles con 44100Hz, pero me preguntaba si hay una tabla que muestre qué tasas de muestreo son válidas para teléfonos específicos. He visto la documentación de Android ( http://developer.android.com/reference/android/media/AudioRecord.html ) pero no ayuda mucho.
¿Alguien ha encontrado una lista de estas tasas de muestreo?

El póster original probablemente ya pasó mucho tiempo atrás, pero lo publicaré en caso de que alguien más encuentre esta pregunta.

Desafortunadamente, en mi experiencia, cada dispositivo puede soportar diferentes frecuencias de muestreo. La única forma segura de saber qué frecuencias de muestra admite un dispositivo es probarlas individualmente comprobando el resultado de AudioRecord.getMinBufferSize () no es negativo (lo que significa que hubo un error) y devuelve un tamaño de búfer mínimo válido.

public void getValidSampleRates() { for (int rate : new int[] {8000, 11025, 16000, 22050, 44100}) { // add the rates you wish to check against int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT); if (bufferSize > 0) { // buffer size is valid, Sample rate supported } } } 

Desafortunadamente, ni siquiera todos los teléfonos admiten la tarifa supuestamente garantizada de 44.1kHz 🙁

He estado probando un Samsung Galaxy Y (GT-S5360L) y si graba desde la fuente de la Camcorder (micrófono de ambiente), las únicas frecuencias admitidas son 8 kHz y 16 kHz. Grabación @ 44.1kHz produce basura total y @ 11.025kHz produce una grabación alterada por el tono con una duración ligeramente menor que el sonido original.

Además, las dos estrategias sugeridas por @Yahma y @Tom fallan en este teléfono en particular, ya que es posible recibir un tamaño de búfer mínimo positivo de una configuración no compatible y, lo que es peor, me he visto obligado a restablecer el teléfono para obtener el la stack de audio vuelve a funcionar, después de intentar usar una clase AudioRecord inicializada a partir de parámetros que producen una instancia de AudioTrack o AudioRecord supuestamente válida (sin excepción).

Francamente, estoy un poco preocupado por los problemas que imagino cuando lanzo una aplicación de sonido al air libre. En nuestro caso, nos vemos obligados a introducir una costosa capa de conversión de frecuencia de muestreo si esperamos reutilizar nuestros algoritmos (esperando una tasa de grabación de 44.1kHz) en este modelo de teléfono en particular.

🙁

Android tiene la función AudioManager.getProperty() para adquirir el tamaño mínimo de búfer y obtener la frecuencia de muestreo preferida para la grabación y reproducción de audio. Pero sí, por supuesto, AudioManager.getProperty () no está disponible en el nivel API <17 . Aquí hay un ejemplo de ejemplo de código sobre cómo usar esta API.

 // To get preferred buffer size and sampling rate. AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER); Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate); 

Aunque es una respuesta tardía, pensé que esto podría ser útil.

Tengo un teléfono (Acer Z3) donde obtengo un tamaño de búfer positivo devuelto por AudioRecord.getMinBufferSize (…) cuando pruebo 11025 Hz. Sin embargo, si posteriormente corro

 audioRecord = new AudioRecord(...); int state = audioRecord.getState(); if (state != AudioRecord.STATE_INITIALIZED) ... 

Puedo ver que esta tasa de muestreo de hecho no representa una configuración válida (como lo señaló el usuario1222021 el 5 de junio de 12). Entonces mi solución es ejecutar ambas pruebas para encontrar una tasa de muestreo válida.

Me gustaría ofrecer una alternativa a la respuesta de Yahma.

Estoy de acuerdo con su proposición de que debe ser probado (aunque presumiblemente varía según el modelo, no el dispositivo), pero el uso de getMinBufferSize me parece un poco indirecto.

Para probar si se admite una frecuencia de muestreo deseada, sugiero intentar construir una instancia de AudioTrack con la frecuencia de muestreo deseada; si no se admite la frecuencia de muestreo especificada, obtendrá una excepción del formulario:

“java.lang.IllegalArgumentException: 2756Hz no es una velocidad de muestreo admitida”

Este método proporciona la frecuencia de muestreo de audio mínima admitida por su dispositivo.

NOTA : puede invertir el ciclo for para obtener la frecuencia de muestreo máxima admitida por su dispositivo (no olvide cambiar el nombre del método).

NOTA 2 : Aunque el doc de Android dice que se admite una frecuencia de muestreo de 48000 (48khz), he agregado todas las tasas de muestreo posibles (como en wikipedia) ya que los nuevos dispositivos pueden grabar audio UHD en velocidades de cuadros mayores (de muestreo).

 private int getMinSupportedSampleRate() { /* * Valid Audio Sample rates * * @see Wikipedia */ final int validSampleRates[] = new int[] { 8000, 11025, 16000, 22050, 32000, 37800, 44056, 44100, 47250, 48000, 50000, 50400, 88200, 96000, 176400, 192000, 352800, 2822400, 5644800 }; /* * Selecting default audio input source for recording since * AudioFormat.CHANNEL_CONFIGURATION_DEFAULT is deprecated and selecting * default encoding format. */ for (int i = 0; i < validSampleRates.length; i++) { int result = AudioRecord.getMinBufferSize(validSampleRates[i], AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_DEFAULT); if (result != AudioRecord.ERROR && result != AudioRecord.ERROR_BAD_VALUE && result > 0) { // return the mininum supported audio sample rate return validSampleRates[i]; } } // If none of the sample rates are supported return -1 handle it in // calling method return -1; } 
  public class Bigestnumber extends AsyncTask{ ProgressDialog pdLoading = new ProgressDialog(MainActivity.this); @Override protected String doInBackground(String... params) { final int validSampleRates[] = new int[]{ 5644800, 2822400, 352800, 192000, 176400, 96000, 88200, 50400, 50000, 48000,47250, 44100, 44056, 37800, 32000, 22050, 16000, 11025, 4800, 8000}; TrueMan = new ArrayList  (); for (int smaple : validSampleRates){ if(validSampleRate(smaple) == true) { TrueMan.add(smaple); }} return null; } @Override protected void onPostExecute(String result) { Integer largest = Collections.max(TrueMan); System.out.println("Largest " + String.valueOf(largest)); } } public boolean validSampleRate(int sample_rate) { AudioRecord recorder = null; try { int bufferSize = AudioRecord.getMinBufferSize(sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); } catch(IllegalArgumentException e) { return false; } finally { if(recorder != null) recorder.release(); } return true; } 

Este Código te dará la Frecuencia de muestreo admitida máxima en tu sistema operativo Android. Solo declarar ArrayList TrueMan; en tu inicio de la clase. Luego puede usar una frecuencia de muestreo alta en AudioTrack y AudioRecord para obtener una mejor calidad de sonido. Referencia .

Solo algo de información actualizada aquí. Pasé un tiempo tratando de acceder a la grabación desde el micrófono para trabajar con Android 6 (4.4 KitKat estaba bien). El error que se muestra es el mismo que obtuve para 4.4 cuando uso la configuración incorrecta para la frecuencia de muestreo / pcm, etc. Pero mi problema fue que los permisos en AndroidManifest.xml ya no son suficientes para solicitar acceso al micrófono y, de hecho, esto ahora debe hacerse en tiempo de ejecución: https://developer.android.com/training/permissions/requesting.html