5

Ich möchte Mikrofon-Audiodaten über Multipeer Connectivity (iOS 8) senden und über den Lautsprecher des empfangenden Peers abspielen. Ich habe auch die AVAudioEngine eingerichtet und ich kann die Mikrofondaten von der (oberen) Lautsprecherausgabe hören, aber ich weiß nicht, wie man AVAudioPCMBuffer über das Netzwerk sendet. Hier ist mein Code-Schnipsel:iOS8 AVAudioEngine Senden von Mikrofondaten über 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]); 
} 

Schicke ich es als NSData oder NStream?

Schätzen Sie für die Hilfe. Danke.

Antwort

0

habe ich diese Lösung nicht versucht:

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

Sie können einen float-Array erhalten durch die property buffer.floatChannelData verwenden. Jetzt können Sie dieses Float-Array in NSOutputStream packen und es senden.

Auf Client-Seite können Sie versuchen, einen Stream zu empfangen:

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

Aber bevor Sie dies versuchen, könnten Sie versuchen, zufällige Werte senden (also white noise) anstelle des Schwimmers Array, so dass Sie sicherstellen können, , dass der Zeitschlitz für das Senden dieser Puffer (wir sprechen über Echtzeit) breit genug ist.

aktualisieren 2014.10.15 ich genau das gefunden was Sie brauchen: http://robots.thoughtbot.com/streaming-audio-to-multiple-listeners-via-ios-multipeer-connectivity

+0

Hallo Michael, thx fo die Antwort. MCSessionDelegate hat diese Methode: session: didReceiveStream: withName: fromPeer: Ist es möglich, die Daten stattdessen als Stream zu senden? da es einen kontinuierlichen Datenfluss gibt. Und was bedeutet "Zeitschlitz ist breit genug"? Danke. –

+0

Ich dachte, du fragst nur nach dem Absender. Ich habe den Empfänger hinzugefügt. Für die zweite Frage vereinfache ich: wenn die Audiodaten schneller zum Empfänger kommen als die Bluetooth-Verbindung; das meinte ich mit "Zeitfenster". –

+0

Hallo Michael, danke für die schnelle Antwort. Verzeih mir ... ich meinte startStreamWithName: toPeer: error :, didReceiveStream ist der empfangende Teil. Ich habe versucht, mit NSData zu senden und zu empfangen, aber ich habe ein Problem auf der Empfängerseite. Ich sende mit [NSData dataWithBytes: buffer.floatChannelData length: buffer.frameLength], wie konvertiere ich die empfangenen Bytes Daten zurück zu AVAudioPCMBuffer? Da ich AVAudioPlayerNode verwenden werde, um den Puffer wiederzugeben. In den Apple-Dokumenten gibt es keinen 'Setter' für buffer.floatChannelData. –