iOS - создайте NSURL из NSFileHandle или NSPipe - PullRequest
8 голосов
/ 22 ноября 2011

Я получаю поток закодированного звука по сети, но в нем смешана куча данных, поэтому мне нужно принять пакеты, вырезать звук и затем воспроизвести звук.

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. Как мне создать NSURL из существующего NSFileHandle? Есть ли какой-то лучший подход к этому полностью? Есть ли способ записать данные во что-то, что может стать NSURL?

Единственное реальное требование - я могу воспроизводить звук как можно ближе к реальному времени. Я не хочу ставить данные в очередь даже на одну десятую секунды, прежде чем они будут воспроизведены.

1 Ответ

0 голосов
/ 09 апреля 2013

Невозможно получить URL NSFileHandle, потому что не у всех дескрипторов есть соответствующий URL. Ваш пример может показаться одним из таких примеров.

...