Pregunta

Estoy escribiendo una aplicación para iPhone que necesita grabar audio desde el micrófono incorporado y luego enviar esos datos de audio a un servidor para su procesamiento.

La aplicación utiliza una conexión Socket para conectarse al servidor y los servicios de cola de audio para hacer la grabación. Lo que no estoy seguro es cuándo enviar los datos. Los servicios de cola de audio disparan una devolución de llamada cada vez que ha llenado un búfer con algunos datos de audio. NsoutputStream dispara un evento cada vez que tiene espacio disponible.

Mi primer pensamiento fue enviar los datos al servidor en la devolución de llamada de la cola de audio. Pero parece que esto se encontraría con un problema si el NsoutputStream no tiene espacio disponible en ese momento.

Luego pensé en almacenar los datos a medida que regresa de la cola de audio y enviando algunos cada vez que el NsoutputStream dispara un evento disponible. Pero esto parecería tener un problema si el envío al servidor se adelanta a la grabación de audio, entonces habrá una situación en la que no hay nada que escribir en el evento disponible, por lo que el evento no se disparará nuevamente y la transferencia de datos se detendrá efectivamente.

Entonces, ¿cuál es la mejor manera de manejar esto? ¿Debería tener un temporizador que dispare repetidamente y ver si hay espacio disponible y hay datos que deben enviarse? Además, creo que tendré que hacer una sincronización de subprocesos para poder eliminar los datos de mi búfer para enviar a través de la red, pero también agregar fragmentos de datos al búfer a medida que avanza la grabación sin arriesgar mi búfer.

¿Fue útil?

Solución

Puede usar un búfer de anillo para contener un cierto número de marcos de audio y framas de caída si el búfer excede un cierto tamaño. Cuando se llame a su devolución de llamada disponible para tener espacio-espacio, extraiga un marco del búfer del anillo y envíelo.

Chdatestructuras Proporciona algunas clases de buffer de anillo (que llama "búfer circular").

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top