iOS: código de muestra para grabación y reproducción simultánea

Estoy diseñando una prueba de concepto simple para el grabador multipista.

El punto de partida obvio es jugar desde el archivo A.caf a los auriculares mientras graba simultáneamente la entrada del micrófono en el archivo B.caf

Esta pregunta – Grabar y reproducir audio simultáneamente – señala que hay tres niveles en los que puedo trabajar:

  • API de AVFoundation (AVAudioPlayer + AVAudioRecorder)
  • API Audio Queue
  • Audio Unit API (RemoteIO)

¿Cuál es el mejor nivel para trabajar? Obviamente, la respuesta genérica es trabajar al más alto nivel que hace el trabajo, que sería AVFoundation.

Pero estoy aceptando este trabajo de alguien que se dio por vencido debido a problemas de latencia (estaba recibiendo un retraso de 0.3 segundos entre los archivos), ¿entonces quizás necesito trabajar a un nivel más bajo para evitar estos problemas?

Además, ¿de qué código fuente está disponible el trampolín? He estado buscando en SpeakHere sample ( http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html ). si no puedo encontrar algo más simple, usaré esto.

¿Pero alguien puede sugerir algo más simple / else? Preferiría no trabajar con código C ++ si puedo evitarlo.

¿Alguien sabe de algún código público que usa AVFoundation para hacer esto?

EDITAR: Ejemplo de AVFoundation aquí: http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1

EDITAR (2): Mucho mejor buscando uno aquí: http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

EDIT (3): ¿Cómo grabo audio en iPhone con AVAudioRecorder?

Para evitar problemas de latencia, tendrá que trabajar en un nivel más bajo que AVFoundation bien. Echa un vistazo a este código de muestra de Apple – Auriotouch . Utiliza E / S remotas.

Como lo sugirió Viraj, aquí está la respuesta.

Sí, puedes lograr muy buenos resultados usando AVFoundation. En primer lugar, debe prestar atención al hecho de que, tanto para el reproductor como para la grabadora, activarlos es un proceso de dos pasos.

Primero lo preparas.

Entonces lo juegas.

Entonces, prime todo. Entonces juega todo.

Esto reducirá la latencia a aproximadamente 70 ms. Probé grabando un tic de metrónomo, luego lo reproduje a través de los parlantes mientras sostengo el iPhone en los parlantes y grabo simultáneamente.

La segunda grabación tuvo un eco claro, que encontré que era ~ 70ms. Podría haber analizado la señal en Audacity para obtener una compensación exacta.

Entonces, para alinear todo, simplemente realizo Selector: x con Objeto: y después de Delay: 70.0 / 1000.0

Puede haber inconvenientes ocultos, por ejemplo, la demora puede variar de un dispositivo a otro. incluso puede diferir dependiendo de la actividad del dispositivo. Incluso es posible que el hilo pueda ser interrumpido / reprogtwigdo entre el inicio del reproductor y el inicio de la grabadora.

Pero funciona, y es mucho más ordenado que jugar con colas de audio / unidades.

Tuve este problema y lo resolví en mi proyecto simplemente cambiando el parámetro PreferredHardwareIOBufferDuration de AudioSession . Creo que ahora tengo solo 6 ms de latencia, eso es lo suficientemente bueno para mi aplicación.

Verifique esta respuesta que tiene una buena explicación.