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

时间:2014-10-09 04:02:56

标签: ios8 avfoundation core-audio nsstream multipeer-connectivity

我想通过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]);
}

我是以NSData还是NSStream发送的?

感谢您的帮助。 THX。

1 个答案:

答案 0 :(得分: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)而不是float数组,这样您就可以确保发送这些缓冲区的时间段(我们谈论的是真实的)时间足够宽。

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