2011-02-15 23 views
5

Estoy tratando de encontrar la mejor manera de reproducir un bucle de audio sin interrupciones, que el usuario puede cambiar por otro con la menor antelación posible, con un número decente (30-150) de bucles muy cortos disponibles. ¿Será suficiente OpenAL para esto, o necesito profundizar en unidades de audio? La documentación de Apple dice que para la retroalimentación en tiempo real como un instrumento, Audio Units es la opción correcta.Conmutación de bucle de audio en tiempo real para iPhone

Solo quiero obtener la opinión de la comunidad sobre esto, y cualquier enlace y proyecto de muestra sería muy apreciado.

Respuesta

3

Usted puede utilizar AVAudioPlayer a la perfección bucle de un archivo de audio comprimido (numberOfLoops = -1). Sugiero usar archivos CAF codificados en IMA4, ya que se rumorea que se benefician de la descompresión de hardware (ahorrando ciclos de CPU para otras cosas).

Para reducir el tamaño del archivo, puede reducir la tasa de bits (pruebe 96 kbps) y/o usar mono.

Tenga en cuenta que AVAudioPlayer no le permite cambiar el tempo o la frecuencia de reproducción.

+0

Más información sobre OpenAL frente a unidades de audio: http://stackoverflow.com/questions/1002838/audio-on-the-iphone –

+0

Al principio era escéptico sobre si esto me permitiría unir perfectamente diferentes muestras, pero al usar varios comandos de NSTimeInterval (hora actual, duración total) Debería ser capaz de descubrir lo que necesito saber. Muchas gracias y ¡deseadme suerte! – DanF

+0

Buena suerte. Así es como administro la conmutación sin fisuras de bucles/bucles en Hexaphone: utilizo un NSTimer (scheduledTimerWithTimeInterval) para "sombrear" el AVAudioPlayer (también útil para actualizar un indicador de tiempo visible), porque los eventos AVAudioPlayerDelegate no fueron lo suficientemente rápidos para mis necesidades. –

2

esto probablemente realmente no responda a su pregunta, pero ¿alguna vez miró Finch? Solo mirando la fuente puede proporcionar algunos punteros.

  • Johannes
+0

Es una aplicación de sonido muy fácil de implementar, pero desafortunadamente no veo nada para detectar el final de una muestra, o cualquier otra cosa que facilite el bucle. – DanF

1

Si necesita poder cambiar a otra muestra de audio sin demora de reproducción, necesitará usar OpenAL. AVAudioPlayer tiene un retraso antes de que comience a reproducirse.

Puede minimizar ese retraso llamando a prepareToPlay, pero no siempre eliminará por completo el retraso. Además, si tiene de 30 a 150 muestras que el usuario selecciona para su reproducción, no sabrá de antemano qué muestras deben precargarse.

He aquí un resumen de los pros y los contras entre OpenAL y AVAudioPlayer: http://kstenerud.github.com/ObjectAL-for-iPhone/documentation/index.html#choosing_sec

+0

Si las muestras son lo suficientemente pequeñas, pensé que podría precargarlas todas. ¿Conoces el tamaño de la caché? – DanF

+0

Las muestras en OpenAL deben estar descomprimidas PCM, 16 bits (técnicamente 8 bits están permitidas pero nunca lo he hecho funcionar en el iPhone). Por lo tanto, si no están en ese formato, deberá almacenarlos sin comprimir o descomprimir al cargarlos. Siempre y cuando tengas suficiente RAM libre para cargar todo, estarás bien. El límite total de RAM en aplicaciones para dispositivos iOS basados ​​en arm6 más antiguos (como iPhone 3g) es de alrededor de 24 MB. Después de eso, corre el riesgo de que el SO lo cierre. Con dispositivos posteriores, tienes mucha más RAM para jugar. – Karl

+0

Otra cosa si todavía piensas en AVAudioPlayer: no creo que puedas tener 30-150 AVAudioPlayers con audio precargado. En realidad, no lo he intentado, pero para eso no fue diseñado AVAudioPlayer. – Karl

0

Terminé usando la biblioteca de audio de Cocos2D para esto, y era mucho más performante de lo que esperaba. AVAudioPlayer terminó siendo un poco más bajo de lo que yo necesitaba.

Cuestiones relacionadas