2011-11-22 23 views
8

Estoy recibiendo una secuencia de audio codificado a través de la red, pero hay una gran cantidad de datos mezclados así que necesito recibir los paquetes, quitar el audio y luego reproducir el audio. iOS - Crear un NSURL desde NSFileHandle o NSPipe

AVAudioPlayer, que puede o no ser la mejor herramienta para esto, pero es la ruta que estoy buscando actualmente, quiere datos de NSData o NSURL. NSData no funcionará porque es una secuencia de datos y quiero que comience tan pronto como llegue y continúe reproduciéndose. Mi pensamiento fue:

NSPipe *pipe = [[NSPipe alloc] init]; 
NSFileHandle *writeHandle = [pipe fileHandleForWriting]; 
NSFileHandle *readHandle = [pipe fileHandleForReading]; 

// in network reception thread... 
NSData *audioData = [packet getAudioData]; 
[writeHandle writeData:audioData]; 

// in audio thread... 
NSURL *url = [[NSURL alloc] init]; 
[url setResourceValue:NSURLFileResourceTypeNamedPipe 
       forKey:NSURLFileResourceTypeKey 
       error:&error]; 
// Connect the readHandle 
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] 
           initWithContentsOfURL:url 
               error:&error]; 

Sin embargo, no sé cómo pasar el `readHandle` en la URL. ¿Cómo creo un NSURL desde un NSFileHandle existente? ¿Hay algún mejor enfoque para esto por completo? ¿Hay alguna manera de escribir datos en algo que pueda convertirse en un NSURL?

El único requisito real es que pueda reproducir el audio lo más casi posible en tiempo real. No quiero poner en cola los datos ni siquiera por una décima de segundo antes de que se reproduzca.

+0

¿Qué tal crear una tubería con nombre y crear una URL de esa tubería con nombre? –

+0

WTP - Gracias. Me gusta la idea e incluso busqué la forma de hacerlo, pero no vi nada sobre las tuberías con nombre en iOS. Sugerencias? – Schlameel

+0

iOS es un sistema UNIX basado en Mac OS X, por lo que debería ser posible usar ['mkfifo'] (http://www.unix.com/man-page/FreeBSD/2/mkfifo/) para crear un nombre tubo. Entonces simplemente creas un 'NSURL' de eso. –

Respuesta

0

No es posible recuperar una URL de NSFileHandle porque no todos los identificadores tienen una URL correspondiente. Tu ejemplo parece ser uno de esos ejemplos.