Tentando transmitir áudio do microfone para outro telefone via conectividade de vários usuários

Estou tentando transmitir áudio do microfone para outro iPhone através da estrutura de conectividade da Apple Multipeer. Para capturar e reproduzir áudio, estou usando o AVAudioEngine (muito obrigado porPunho Rítmicos respostaaqui)

Eu recebo dados do microfone instalando uma torneira na entrada; dessa forma, estou recebendo um AVAudioPCMBuffer que, em seguida, converto em uma matriz de UInt8 que depois transmito para o outro telefone.

Mas quando estou convertendo a matriz novamente em um AVAudioPCMBuffer, recebo uma exceção EXC_BAD_ACCESS com o compilador apontando para o método em que estou convertendo a matriz de bytes em AVAudioPCMBuffer novamente.

Aqui está o código para onde estou indo, convertendo e transmitindo a entrada:

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)
            })

Minhas duas funções para converter os dados (tiradas deMartin.Rresposta deaqui):

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
}

E no lado receptor:

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)

        }
    }
}

O problema é que eu posso converter o array de bytes para frente e para trás e reproduzir som dele antes de transmitir (no mesmo telefone), mas não criar o AVAudioPCMBuffer na extremidade receptora. Alguém sabe por que a conversão não funciona no lado receptor? Este é o caminho certo a seguir?

Qualquer ajuda, pensamentos / opiniões sobre isso seriam muito apreciados.

questionAnswers(1)

yourAnswerToTheQuestion