2011-03-15 13 views
6

Para cargar un archivo de sonido, tengo el siguiente código en mi aplicación:Streaming con un AVAudioplayer

- (id) init:(NSString*)a_filename ext:(NSString*)a_ext 
{ 
    ... 

    NSString *t_soundFilePath = [CFileLoader getPathForResource:filename WithExtension:ext]; 
    NSURL *t_fileURL = [[[NSURL alloc] initFileURLWithPath: t_soundFilePath] autorelease]; 

    player = [[AVAudioPlayer alloc] initWithContentsOfURL: t_fileURL error: nil]; 
    [player prepareToPlay]; 
    ... 

    } 

Todos los sonidos que me carga están en mi paquete, así que me gustaría saber si el El método "initwithcontentsofurl" transmite el archivo de sonido o si todo el archivo está en caché.

Tengo muchos sprites en mi aplicación, así que quiero minimizar el espacio de memoria utilizado para los sonidos.

THX por su ayuda

Respuesta

6

Los sonidos que se reproducen con el AVAudioPlayer se transmiten en tiempo real desde el almacenamiento. El inconveniente es que ocasionalmente puede notar un pequeño retraso cuando se debe iniciar. Si usa OpenAL, los sonidos se cargan por completo en la memoria.

Hay una buena discusión de este tipo de cosas en la documentación ObjectAL, una biblioteca que está destinada a simplificar la reproducción de sonidos y efectos en el iPhone.

+0

Genial! Gracias. Ya he implementado un transmisor de sonido en OpenAL. Lamentablemente, han aparecido errores desde IOS 4.3 y tengo que cambiar la API. – Klem

+0

Error de OpenAL en ios 4.3 se detalla aquí: https://devforums.apple.com/message/396043#396043 – Klem

6

Si desea transmitir audio en su aplicación se puede utilizar el siguiente jugador en lugar de utilizar AVAudioPlayer

https://github.com/mattgallagher/AudioStreamer

Para este jugador no es necesario para poner archivos de sonido en su paquete, puede ponerlos en el servidor y usar la url para transmitir audio.

Espero que esto te ayude.

3

" The AVAudioPlayer class does not provide support for streaming audio based on HTTP URL's. The URL used with initWithContentsOfURL: must be a File URL (file://). That is, a local path".

https://developer.apple.com/library/ios/qa/qa1634/_index.html

Pero se puede evitar - por ejemplo, escribir de forma asíncrona al archivo local, e init AVAudioPlayer con esta dirección de fichero, que va a funcionar.

+0

Puede hacer NSData * data = [NSData dataWithContentsOfURL: soundUrl]; AVAudioPlayer * player = [[AVAudioPlayer alloc] initWithData: error de datos: nil]; Básicamente transmitirá los datos en la memoria, y AVAudioPlayer reproducirá desde los datos dentro de la memoria –

+0

@GiaDang Sí, pero su hilo se bloqueará hasta que el archivo de audio * haya sido * completamente * descargado por el método dataWithContentsOfURL: en lugar de reproducirlo uno o dos segundos y almacenamiento en búfer mientras la reproducción continúa, como lo hace AVPlayer. Por lo tanto, no solo llevará mucho tiempo, pero si no coloca este código en una secuencia de fondo, la aplicación se * congelará por completo * hasta que la canción se haya descargado. En general, no creo que esta sea la mejor solución. –