5

Я хочу отправить аудиоданные микрофона через Multipleer Connectivity (iOS 8) и воспроизвести его через динамик принимающего партнера. Я также настраиваю AVAudioEngine, и я могу слышать данные микрофона с выхода (верхнего) динамика, но я не знаю, как отправить AVAudioPCMBuffer по сети. Вот мой фрагмент кода:iOS8 AVAudioEngine Как отправить данные микрофона через Multipeer Connectivity?

AVAudioInputNode *inputNode =[self.engine inputNode]; 
AVAudioMixerNode *mainMixer = [self.engine mainMixerNode]; 
[self.engine connect:inputNode to:mainMixer format:[inputNode inputFormatForBus:0]]; 

[mainMixer installTapOnBus:0 bufferSize:4096 format:[mainMixer outputFormatForBus:0] 
    block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) { 

    //==== How to send the PCMBuffer ?? ======// 
}]; 

NSError *error = nil; 
[self.engine startAndReturnError:&error]; 

if(error) 
{ 
    NSLog(@"error: %@", [error localizedDescription]); 
} 

Я отправляю его как NSData или NSStream?

Цените помощь. Спасибо.

ответ

0

Я не пробовал это решение:

- (NSOutputStream *)startStreamWithName:(NSString *)streamName 
           toPeer:(MCPeerID *)peerID 
            error:(NSError **)error 

Вы можете получить массив с плавающей точкой, используя property buffer.floatChannelData. Теперь вы можете упаковать этот массив float в NSOutputStream и отправить его.

На стороне клиента вы можете попытаться получить поток:

- (void)session:(MCSession *)session 
didReceiveStream:(NSInputStream *)stream 
     withName:(NSString *)streamName 
     fromPeer:(MCPeerID *)peerID 
{ 
    stream.delegate = self; 
    [stream scheduleInRunLoop:[NSRunLoop mainRunLoop] 
         forMode:NSDefaultRunLoopMode]; 
    [stream open]; 
} 

Но прежде, чем вы попробуете это, вы могли бы попытаться отправить случайные значения (поэтому white noise) вместо массива поплавка, так что вы можете убедиться, , что временной интервал для отправки этих буферов (мы говорим о реальном времени) достаточно широк.

Update 15.10.2014 Я нашел именно то, что вам нужно: http://robots.thoughtbot.com/streaming-audio-to-multiple-listeners-via-ios-multipeer-connectivity

+0

Привет Майкл, ТНХ Fo ответ. MCSessionDelegate имеет этот метод: session: didReceiveStream: withName: fromPeer: возможно ли отправлять данные как поток? поскольку это непрерывный поток данных. И что означает «временной интервал»? Спасибо. –

+0

Я думал, что вы спрашиваете только об отправителе. Я добавил ресивер. Для второго вопроса я упрощаю: если аудиоданные поступают быстрее на приемник, чем может работать соединение Bluetooth; это я имел в виду под «временным интервалом». –

+0

Привет, Майкл, спасибо за быстрый ответ. Простите меня ... Я имел в виду startStreamWithName: toPeer: error :, didReceiveStream - получающая часть. Я пробовал отправлять и получать с использованием NSData, но у меня проблема на принимающей стороне. Я посылаю с использованием [NSData dataWithBytes: buffer.floatChannelData length: buffer.frameLength], как мне преобразовать полученные данные байтов в AVAudioPCMBuffer? Поскольку я буду использовать AVAudioPlayerNode для воспроизведения буфера. В документах Apple нет «setter» для buffer.floatChannelData. –

Смежные вопросы