iOS8 AVAudioEngine如何通过Multipeer Connectivity发送麦克风数据?

Jac*_*art 5 core-audio avfoundation nsstream multipeer-connectivity ios8

我想通过Multipeer Connectivity(iOS 8)发送麦克风音频数据,并通过接收对等体的扬声器播放.我还设置了AVAudioEngine,我可以听到(上方)扬声器输出的麦克风数据,但我不知道如何通过网络发送AVAudioPCMBuffer.这是我的代码片段:

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]);
}
Run Code Online (Sandbox Code Playgroud)

我是以NSData还是NSStream发送的?

感谢您的帮助.谢谢.

Mic*_*ner 0

我没有尝试过这个解决方案:

- (NSOutputStream *)startStreamWithName:(NSString *)streamName
                                 toPeer:(MCPeerID *)peerID
                                  error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

您可以使用属性buffer.floatChannelData接收浮点数组。现在您可以将此浮点数组打包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];
}
Run Code Online (Sandbox Code Playgroud)

但在尝试此操作之前,您可以尝试发送随机值(因此是白噪声)而不是浮点数组,这样您就可以确保发送这些缓冲区的时隙(我们正在谈论实时)足够宽。

更新 15.10.2014 我找到了你所需要的: http://robots.thoughtbot.com/streaming-audio-to-multiple-listeners-via-ios-multipeer-connectivity