Попытка потокового аудио с микрофона на другой телефон через многопользовательское соединение
Я пытаюсь транслировать звук с микрофона на другой iPhone через платформу Apple Multipeer Connectivity. Для захвата и воспроизведения звука я использую AVAudioEngine (большое спасибоРитмичный ФистманответВот).
Я получаю данные с микрофона, устанавливая сигнал на входе, после чего я получаю AVAudioPCMBuffer, который затем преобразую в массив UInt8, который затем передается на другой телефон.
Но когда я преобразовываю массив обратно в AVAudioPCMBuffer, я получаю исключение EXC_BAD_ACCESS с компилятором, указывающим на метод, в котором я снова преобразовываю байтовый массив в AVAudioPCMBuffer.
Вот код для того, где я беру, преобразовываю и транслирую ввод:
input.installTap(onBus: 0, bufferSize: 2048, format: input.inputFormat(forBus: 0), block: {
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
let audioBuffer = self.typetobinary(buffer)
stream.write(audioBuffer, maxLength: audioBuffer.count)
})
Мои обе функции для преобразования данных (взяты изMartin.RответВот):
func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T {
return value.withUnsafeBufferPointer {
UnsafeRawPointer($0.baseAddress!).load(as: T.self)
}
}
func typetobinary<T>(_ value: T) -> [UInt8] {
var data = [UInt8](repeating: 0, count: MemoryLayout<T>.size)
data.withUnsafeMutableBufferPointer {
UnsafeMutableRawPointer($0.baseAddress!).storeBytes(of: value, as: T.self)
}
return data
}
И на приемном конце:
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
if streamName == "voice" {
stream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode)
stream.open()
var bytes = [UInt8](repeating: 0, count: 8)
stream.read(&bytes, maxLength: bytes.count)
let audioBuffer = self.binarytotype(bytes, AVAudioPCMBuffer.self) //Here is where the app crashes
do {
try engine.start()
audioPlayer.scheduleBuffer(audioBuffer, completionHandler: nil)
audioPlayer.play()
}catch let error {
print(error.localizedDescription)
}
}
}
Дело в том, что я могу конвертировать байтовый массив вперед и назад и воспроизводить звук с него до того, как я его транслирую (в том же телефоне), но не могу создать AVAudioPCMBuffer на принимающей стороне. Кто-нибудь знает, почему преобразование не работает на принимающей стороне? Это правильный путь?
Любая помощь, мысли / вклад по этому поводу будет высоко ценится.