2011-11-22 22 views
8

我正在通過網絡接收一串編碼音頻,但有一堆數據混合在一起,所以我需要接收數據包,去掉音頻然後播放音頻。 iOS - 從NSFileHandle或NSPipe創建一個NSURL

AVAudioPlayer,它可能是也可能不是最好的工具,但它是我目前正在追逐的路徑,需要來自NSData或NSURL的數據。 NSData將無法工作,因爲它是一個數據流,我希望它在到達時立即啓動並繼續播放。我的想法是:

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

不過,我不知道怎麼了`readHandle`傳遞到URL。我如何從現有的NSFileHandle創建一個NSURL?對此有沒有更好的方法?有沒有辦法將數據寫入可以成爲NSURL的東西?

唯一真正的要求是我可以儘可能接近實時地播放音頻。我不想在數據播放之前將數據排隊等待十分之一秒。

+0

如何創建一個命名管道並創建該命名管道的URL? – 2011-11-22 19:48:25

+0

WTP - 謝謝。我喜歡這個想法,甚至搜索瞭如何做,但沒有看到有關iOS中命名管道的任何信息。建議? – Schlameel

+0

iOS是基於Mac OS X的UNIX系統,所以應該可以使用['mkfifo'](http://www.unix.com/man-page/FreeBSD/2/mkfifo/)創建一個名稱管。然後你簡單地創建一個'NSURL'。 – 2011-11-22 20:18:32

回答

0

無法檢索NSFileHandle的URL,因爲並非所有句柄都有對應的URL。你的例子看起來就是這樣一個例子。