2011-11-22 3 views
8

Sto ricevendo un flusso di audio codificato sulla rete, ma c'è un mucchio di dati mescolati in così ho bisogno di ricevere i pacchetti, togliere l'audio e poi riprodurre il Audio. iOS - Crea un NSURL da un NSFileHandle o NSPipe

AVAudioPlayer, che può o non può essere lo strumento migliore per questo, ma è il percorso Attualmente sto inseguendo, vuole i dati da NSData o NSURL. NSData non funzionerà perché è un flusso di dati e voglio che inizi appena arriva e continua a giocare. Il mio pensiero era:

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]; 

Tuttavia, non so come passare il `readHandle` nell'URL. Come posso creare un NSURL da un NSFileHandle esistente? C'è un approccio migliore per questo completamente? C'è un modo per scrivere dati in qualcosa che può diventare un NSURL?

L'unico vero requisito è che io possa riprodurre l'audio il più vicino possibile in tempo reale. Non voglio mettere in coda i dati nemmeno per un decimo di secondo prima di essere riprodotto.

+0

Che dire creare una pipe denominata e creare un URL di quella named pipe? –

+0

WTP - Grazie. Mi piace l'idea e ho anche cercato come farlo, ma non ho visto nulla sui named pipe in iOS. Suggerimenti? – Schlameel

+0

iOS è un sistema UNIX basato su Mac OS X, quindi dovrebbe essere possibile usare ['mkfifo'] (http://www.unix.com/man-page/FreeBSD/2/mkfifo/) per creare un nome tubo. Quindi devi semplicemente creare un 'NSURL' di quello. –

risposta

0

Non è possibile recuperare l'URL di NSFileHandle perché non tutti gli handle hanno un URL corrispondente. Il tuo esempio sembrerebbe essere un esempio del genere.