5

Tôi muốn gửi dữ liệu âm thanh micrô qua Kết nối đa năng (iOS 8) và phát qua loa của người nhận. Tôi cũng đã thiết lập AVAudioEngine và tôi có thể nghe thấy dữ liệu micrô từ đầu ra loa (trên), nhưng tôi không biết cách gửi AVAudioPCMBuffer qua mạng. Đây là đoạn mã của tôi:iOS8 AVAudioEngine cách gửi dữ liệu micrô qua kết nối 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]); 
} 

Tôi có gửi nó dưới dạng NSData hoặc NSStream không?

Đánh giá cao sự trợ giúp. Cám ơn.

Trả lời

0

Tôi chưa thử giải pháp này:

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

Bạn có thể nhận được một mảng float bằng property buffer.floatChannelData. Bây giờ bạn có thể gói mảng float này vào NSOutputStream và gửi nó.

Về phía khách hàng mà bạn có thể thử để nhận được một dòng:

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

Nhưng trước khi bạn cố gắng này, bạn có thể thử để gửi các giá trị ngẫu nhiên (do đó white noise) thay vì các mảng float, vì vậy bạn có thể chắc chắn , rằng khe thời gian để gửi các bộ đệm này (chúng ta đang nói về thời gian thực) là đủ rộng.

Cập nhật 2014/10/15 tôi tìm thấy chính xác những gì bạn cần: http://robots.thoughtbot.com/streaming-audio-to-multiple-listeners-via-ios-multipeer-connectivity

+0

Hi Michael, thx fo câu trả lời. MCSessionDelegate có phương thức này: session: didReceiveStream: withName: fromPeer: Có thể gửi dữ liệu dưới dạng luồng không? vì đó là luồng dữ liệu liên tục. Và, 'khe thời gian đủ rộng' nghĩa là gì? Cám ơn. –

+0

Tôi nghĩ bạn đã hỏi về người gửi. Tôi đã thêm nội dung người nhận. Đối với câu hỏi thứ hai, tôi đơn giản hóa: nếu dữ liệu âm thanh đến nhanh hơn với người nhận hơn kết nối Bluetooth có thể xử lý; điều này tôi có nghĩa là bởi 'khe thời gian'. –

+0

Xin chào Michael, thx cho câu trả lời nhanh chóng. Xin lỗi ... tôi có nghĩa là startStreamWithName: toPeer: error :, didReceiveStream là phần nhận. Tôi đã thử gửi và nhận bằng NSData, nhưng tôi đã gặp sự cố ở phía bên nhận. Tôi gửi bằng cách sử dụng [dữ liệu NSDataWithBytes: buffer.floatChannelData length: buffer.frameLength], làm cách nào để chuyển đổi dữ liệu byte đã nhận trở lại thành AVAudioPCMBuffer? Vì tôi sẽ sử dụng AVAudioPlayerNode để phát lại bộ đệm. Trong tài liệu của Apple, không có 'setter' cho buffer.floatChannelData. –

Các vấn đề liên quan