Red de conocimiento informático - Conocimiento informático - Cómo capturar un cuadro de audio

Cómo capturar un cuadro de audio

Este artículo presenta principalmente cómo capturar un cuadro de datos de audio en la plataforma Android. Antes de leer este artículo, se recomienda leer mi artículo anterior "Desarrollo de audio de Android (1): conocimientos básicos", porque el proceso de desarrollo de audio generalmente implica estos conocimientos básicos. Después de dominar estos conceptos importantes, hay muchos parámetros y procesos en el proceso de desarrollo. Será más fácil de entender

El SDK de Android proporciona dos conjuntos de API de captura de audio: MediaRecorder y AudioRecord. El primero es una API de nivel superior que puede codificar y codificar directamente los datos de audio grabados por el móvil. Comprime el micrófono del teléfono (como AMR, MP3, etc.) y guárdalo como un archivo, mientras que este último está más cerca de la parte inferior y permite un control más libre y flexible para obtener los datos de audio PCM originales cuadro por cuadro. >

Si simplemente desea crear una grabadora de voz y grabar archivos de audio, se recomienda utilizar MediaRecorder, y si necesita realizar un procesamiento algorítmico adicional del audio o utilizar bibliotecas de codificación de terceros para la compresión, transmisión de red y otras aplicaciones, se recomienda utilizar AudioRecord. De hecho, MediaRecorder también llama a AudioRecord con Android Interact with AudioFlinger en el marco.

En el desarrollo de audio, la aplicación más amplia no se limita a local. grabación, por lo que debemos centrarnos en cómo usar la API AudioRecord de nivel inferior para capturar datos de audio (tenga en cuenta que los datos de audio que captura están en el formato PCM original. Si desea comprimirlos en mp3, aac, etc. , debe llamar al codificador para codificarlo especialmente)

1. Flujo de trabajo de AudioRecord

p>

Primero, comprendamos el flujo de trabajo de AudioRecord:

(1) Configurar parámetros e inicializar el búfer de audio interno

(2) Iniciar colección

(3) Se requiere un subproceso para "obtener" continuamente datos de audio del búfer AudioRecord. Al "leer" datos de audio del búfer AudioRecord, tenga en cuenta que este proceso debe realizarse de manera oportuna; de lo contrario, se producirá un error de "desbordamiento". Este error es más común en el desarrollo de audio, lo que significa que la capa de aplicación no "obtiene" el archivo. datos de audio a tiempo. Este error es más común en el desarrollo de audio, lo que significa que la capa de aplicación no "obtiene" los datos de audio a tiempo, lo que provoca un desbordamiento del búfer de audio interno. Detener la captura y liberar recursos

2. Configuración de parámetros de AudioRecord

Lo anterior es el constructor de AudioRecord. Podemos encontrar que se basa principalmente en Constructor para configurar los parámetros de captura. El significado de estos parámetros uno por uno (se recomienda consultar mi artículo anterior para comprenderlo):

(1) audioSource

Este parámetro se refiere a la fuente de entrada para la captura de audio. Los valores opcionales se definen en la clase MediaRecorder.AudioSource como constantes. Los valores comunes incluyen: DEFAULT (valor predeterminado), VOICE_RECOGNITION (utilizado para el reconocimiento de voz). Equivalente a DEFAULT), MIC (entrada desde el micrófono del teléfono), VOICE_COMMUNICATION (para aplicaciones VoIP), etc.

(2) sampleRateInHz

Frecuencia de muestreo; tenga en cuenta que actualmente 44.100 Hz es la única frecuencia de muestreo garantizada como compatible con todos los teléfonos Android.

(3)channelConfig

Configura el número de canales. Los valores opcionales se definen como constantes en la clase AudioFormat. Los más utilizados son CHANNEL_IN_MONO (canal único) y CHANNEL_IN_STEREO (doble). canal)

(4) audioFormat

Este parámetro se utiliza para configurar el "ancho de bits de datos" y los valores opcionales también se definen en la clase AudioFormat en forma de constantes. Los más comunes incluyen ENCODING_PCM_16BIT (16 bits), ENCODING_PCM _8BIT (8 bits), tenga en cuenta que se garantiza que el primero es compatible con todos los teléfonos Android.

(5) bufferSizeInBytes

Este es el parámetro más difícil e importante para configurar el tamaño del búfer de audio interno de AudioRecord, que no puede ser menor que el tamaño de un cuadro de audio.

tamaño int = frecuencia de muestreo x ancho de bits x tiempo de muestreo x número de canales

El tiempo de muestreo suele estar entre 2,5 ms y 120 ms, según el proveedor o la aplicación. De hecho, podemos inferir que cuanto más corto sea el tiempo de muestreo por cuadro, menor debería ser la latencia. Por supuesto, el grado de fragmentación de los datos también será mayor.

En el desarrollo de Android, la clase AudioRecord proporciona una función para ayudarle a determinar el tamaño del búfer (bufferSizeInBytes), su prototipo es el siguiente:

int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat);

Diferentes fabricantes tienen diferentes implementaciones subyacentes, pero todos obtienen el tamaño de un fotograma según la fórmula anterior. El tamaño del búfer de audio debe ser de 2 a N veces el tamaño de un fotograma. Los amigos interesados ​​pueden continuar explorando el código fuente para discutirlo.

En aplicaciones prácticas, se recomienda encarecidamente calcular el bufferSizeInBytes que esta función necesita pasar, en lugar de calcularlo usted mismo manualmente.

3. Hilo de captura de audio

Después de crear el objeto AudioRecord, puede comenzar a capturar datos de audio y controlar el inicio/detención de la captura a través de las dos funciones siguientes:

AudioRecord.startRecording();

AudioRecord.stop();

Una vez que comiences a capturar, debes pasar el audio a través del bucle de hilo lo antes posible, de lo contrario el sistema se sobrecargará y la interfaz para leer datos La llamada es la siguiente:

AudioRecord.read(byte[] audioData, int offsetInBytes, int sizeInBytes);