Resumen de procesamiento de audio de mi iOS
He estado leyendo la documentación de audio de Apple por un tiempo (toda lista en la sección Recursos) y haciendo algunos desarrollos relacionados con el audio (principalmente grabando usando cancelación de eco). Aquí está mi resumen.
Cada aplicación tiene una instancia de AVAudioSession (es decir, generalmente no se puede obtener una segunda instancia de AVAudioSession). Al usar esta instancia, puede indicarle al sistema cómo la aplicación actual usa el servicio de audio móvil y luego el sistema se coordinará con la configuración de cada aplicación para intentar satisfacer todas las solicitudes de la aplicación. Cuando no pueda satisfacerse, el sistema intentará hacerlo. satisfacer la solicitud de la aplicación en primer plano o el servicio telefónico del sistema, etc. Por ejemplo, si el audio de otra aplicación se está reproduciendo actualmente, es posible que la aplicación actual desee reproducir su propio audio junto con el audio de la otra aplicación, en lugar de pausar el servicio de audio de la otra aplicación o la aplicación actual. Si necesita reproducir audio o grabar; audio o la aplicación actual solo reproduce audio, o la aplicación actual solo graba audio, o la aplicación actual solo reproduce audio, la aplicación actual bloqueará el audio de todas las demás aplicaciones, y así sucesivamente. En resumen, le dice al sistema cómo la aplicación actual utiliza sus servicios de audio.
Las sesiones de audio tienen tres conceptos importantes:
La configuración de estos tres puntos expresa la intención de la aplicación actual de utilizar servicios de audio.
En algunos casos, no necesitamos configurar la categoría de la sesión de audio, por ejemplo, si usamos AVAudioRecorder para grabar audio, no necesitamos configurar la categoría como AVAudioSessionCategoryRecord, porque cuando usamos AVAudioSessionCategoryRecord, el sistema no reconocerá esta categoría. Si usa AVAudioRecorder para grabar audio, no necesita configurar la categoría como AVAudioSessionCategoryRecord, porque el sistema ya configuró esta categoría para nosotros cuando usamos el servicio de grabación de AVAudioRecorder. Además, las sesiones de audio tienen una configuración predeterminada (si la aplicación actual no la tiene). Cuando la configuración predeterminada no puede satisfacer sus necesidades, puede configurar manualmente la sesión de audio
Otra función importante de la sesión de audio es configurar los parámetros de hardware del servicio de audio del sistema, como la cantidad de canales de entrada, la frecuencia de muestreo , Tiempo de espera de caché de IO. El método setPreferred__ en la API puede lograr esta función.
Después de configurar la sesión de audio, cuando el servicio de audio que solicitamos se interrumpe (por ejemplo, entra una llamada, el sistema dejará de grabar y reproducir; por ejemplo, la aplicación vuelve a segundo plano, si el El servicio de audio de la aplicación actual no está configurado para ejecutarse en segundo plano, el sistema detendrá el servicio de audio de la aplicación;), podemos usar el centro de notificaciones para escuchar y procesar en consecuencia. Hay dos conceptos importantes para la interrupción del servicio de audio, a saber, el inicio y el final de la interrupción. Podemos grabar el punto de tiempo de reproducción actual cuando comienza la interrupción y reiniciar la reproducción cuando finaliza la interrupción (por supuesto, el comportamiento predeterminado del sistema es reiniciar la reproducción de audio cuando finaliza la interrupción, pero si el comportamiento predeterminado no puede satisfacer las necesidades, tienes que manejarlo tú mismo).
Otro cambio importante que debemos escuchar en una sesión de audio son los cambios de enrutamiento. Por ejemplo, si aparece una nueva fuente de salida (por ejemplo, cuando el usuario conecta unos auriculares o comienza a utilizar unos auriculares Bluetooth), o si la fuente de salida original ya no está disponible (por ejemplo, cuando el usuario desconecta los auriculares, etc.) , entonces necesitamos escuchar los cambios de ruta.
Hay otras características, como si otras aplicaciones están reproduciendo audio, solicitando permisos de micrófono, etc. Puede consultar la documentación API específica para AVAudioSession.
A través del servicio de cola de audio podemos grabar o reproducir audio.
Por supuesto, podemos reproducir audio fácilmente usando AVAudioPlayer, entonces, ¿por qué utilizar un servicio de cola de audio? Tiene varias ventajas
Lo más importante que hay que entender sobre el servicio de cola de audio es su cola de búfer. Por ejemplo, cuando grabamos audio, normalmente configuramos 3 búfer. Primero, los buffers disponibles se transfieren a la cola correspondiente a través de AudioQueueEnqueueBuffer. Luego, el sistema comienza a grabar los datos de audio en el primer búfer. Cuando el búfer está lleno, la función de devolución de llamada le devolverá el búfer y lo eliminará de la cola. En la función de devolución de llamada, podemos procesar los datos mientras el sistema. comienza Escribe los datos en un segundo búfer y cuando el búfer está lleno, la función de devolución de llamada te devuelve el búfer y lo retira de la cola y en la función de devolución de llamada podemos procesar los datos. Al mismo tiempo, el sistema comienza a escribir datos en el segundo búfer. Después de que nuestra función de devolución de llamada haya procesado el primer búfer devuelto, debemos usar AudioQueueEnqueueBuffer para poner en cola el búfer nuevamente para que el sistema pueda usarlo nuevamente. Cuando regresa el segundo caché, el sistema comienza a escribir en el tercer caché. Cuando finaliza, el sistema regresa al tercer caché y comienza a escribir en el primero. Esta es una estructura de cola típica (primero en entrar, primero en salir, último en entrar, primero en salir).
Las unidades de audio son la capa subyacente de todos los marcos de audio en iOS y macOS. Ya sea que esté utilizando AVAudioRecorder, AVAudioPlayer, Audio Queue Service, OpenAL, etc., la capa inferior de la implementación se realizará en última instancia a través de la unidad de audio.
Hay un número limitado de unidades de audio disponibles en iOS. Puede personalizar las unidades de audio en macOS, pero no puede hacerlo en iOS; debe utilizar las unidades de audio proporcionadas.
¿Cuándo utilizar unidades de audio? Oficialmente, debe usar unidades de audio cuando necesita alto control, alto rendimiento, alta flexibilidad o cuando necesita funciones específicas (como la cancelación de eco, que solo es compatible con unidades de audio y no con ninguna API de nivel superior).
Hay cuatro tipos de unidades de audio (y funcionan tan bien como parecen):
Las unidades de audio personalizadas se utilizan en macOS, pero no en iOS. p>
Hay dos formas de utilizar unidades de audio:
El primer método es adecuado para estructuras más simples.
El segundo método se utiliza para construir procesos de audio complejos. La configuración de las propiedades de una unidad de audio específica todavía utiliza el método directo.
Los conceptos importantes de las unidades de audio son alcance y elementos.
El alcance contiene elementos.
Existen tres tipos de alcance:
El concepto de alcance es un poco abstracto. Un alcance de salida significa que todos los elementos dentro de él se enviarán a algún lugar. En cuanto al alcance global, conviene utilizarlo para configurar algunas propiedades que no tienen nada que ver con los conceptos de entrada y salida.
La explicación oficial de un elemento es que puede considerarse un bus, lo que significa que los datos se pasarán de un extremo del elemento al otro.
No sé cómo responder algunas de las preguntas aquí, así que si sabes algo sobre esto por favor ponte en contacto.