Versuchen, Audio über Multipeer-Konnektivität vom Mikrofon auf ein anderes Telefon zu streamen

Ich versuche, über das Apples Multipeer Connectivity Framework Audio vom Mikrofon auf ein anderes iPhone zu streamen. Für die Audioaufnahme und -wiedergabe benutze ich AVAudioEngine (vielen Dank an Rhythmic Fistman 's answerHie).

Ich empfange Daten vom Mikrofon, indem ich einen Tipp auf den Eingang installiere. Von diesem erhalte ich einen AVAudioPCMBuffer, den ich dann in ein Array von UInt8 konvertiere, das ich dann auf das andere Telefon streame.

Aber wenn ich das Array zurück in einen AVAudioPCMBuffer konvertiere, erhalte ich eine EXC_BAD_ACCESS-Ausnahme, wobei der Compiler auf die Methode verweist, mit der ich das Byte-Array erneut in AVAudioPCMBuffer konvertiere.

Hier ist der Code für den Ort, an dem ich die Eingabe nehme, konvertiere und streame:

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

Meine beiden Funktionen zum Konvertieren der Daten (aus Martin.R 's AntwortHie):

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
}

Und auf der empfangenden Seite:

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)

        }
    }
}

Die Sache ist, dass ich das Byte-Array hin und her konvertieren und Sound abspielen kann, bevor ich ihn streame (im selben Telefon), aber nicht den AVAudioPCMBuffer auf der Empfangsseite erstelle. Weiß jemand, warum die Konvertierung auf der Empfängerseite nicht funktioniert? Ist das der richtige Weg?

Jede Hilfe, Gedanken / Input darüber wäre sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage