5

Chcę przesłać dane audio z mikrofonu przez łączność wielościeżkową (iOS 8) i odtwarzać je przez głośnik uczestnika odbierającego. Ustawiłem również AVAudioEngine i słyszę dane mikrofonu z (górnego) wyjścia głośnikowego, ale nie wiem, jak wysłać AVAudioPCMBuffer przez sieć. Oto mój fragment kodu:iOS8 AVAudioEngine w jaki sposób wysyłać dane mikrofonowe przez łącze Multipeer?

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

Czy wysłać go jako NSData lub NSStream?

Doceń pomoc. Dzięki.

Odpowiedz

0

nie próbowałem tego rozwiązania:

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

można odebrać tablicę pływaka za pomocą property buffer.floatChannelData. Teraz możesz spakować tę tablicę float do NSOutputStream i wysłać ją.

po stronie klienta można próbować odbierać strumień:

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

Ale zanim spróbujesz to, można spróbować wysłać wartości losowych (dlatego white noise) zamiast tablicy pływaka, więc można mieć pewność, , że przedział czasu na wysyłanie tych buforów (mówimy o czasie rzeczywistym) jest wystarczająco szeroki.

Aktualizacja 15.10.2014 znalazłem dokładnie to, czego potrzebujesz: http://robots.thoughtbot.com/streaming-audio-to-multiple-listeners-via-ios-multipeer-connectivity

+0

Cześć Michał, thx fo odpowiedzi. MCSessionDelegate ma tę metodę: session: didReceiveStream: withName: fromPeer: Czy możliwe jest wysłanie danych jako strumienia? ponieważ to ciągły przepływ danych. Co oznacza "wystarczająco długi czas"? Dzięki. –

+0

Myślałem, że pytasz tylko o nadawcę. Dodałem rzeczy odbierające. Na drugie pytanie upraszczam: jeśli dane audio docierają szybciej do odbiornika niż może obsłużyć połączenie Bluetooth; to miałem na myśli "przedział czasowy". –

+0

Cześć Michael, thx za szybką odpowiedź. Wybacz mi ... Miałem na myśli startStreamWithName: toPeer: error :, didReceiveStream jest częścią odbierającą. Próbowałem wysyłać i odbierać przy użyciu NSData, ale mam problem po stronie odbiorczej. Wysyłam używając [NSData dataWithBytes: buffer.floatChannelData length: buffer.frameLength], jak mogę przekonwertować odebrane dane bajtów z powrotem na AVAudioPCMBuffer? Ponieważ użyję AVAudioPlayerNode do odtworzenia bufora. W dokumentach Apple nie ma "ustawnika" dla pliku buffer.floatChannelData. –