Ich versuche, Audio von dem Mikrofon zu einem anderen iPhone über Apples Multipeer Connectivity Framework zu streamen. Für die Audioaufnahme und -wiedergabe verwende ich AVAudioEngine (Vielen Dank an Rhythmic Fistman' s Antwort here).Versuchen, Audio von Mikrofon zu einem anderen Telefon über multipeer Konnektivität zu streamen
Ich erhalte Daten vom Mikrofon, indem ich einen Tipp auf den Eingang installiere, von diesem bekomme ich einen AVAudioPCMBuffer, den ich dann in ein Array von UInt8 umwandle, das ich dann auf das andere Telefon streame.
Aber wenn ich das Array zurück zu einem AVAudioPCMBuffer konvertiere, erhalte ich eine EXC_BAD_ACCESS-Ausnahme, wobei der Compiler auf die Methode verweist, in der ich das Byte-Array wieder in AVAudioPCMBuffer umwandle.
Hier ist der Code für ist, wo ich bin dabei, Konvertieren und Streamen des Eingangs:
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)
})
für My beide Funktionen der Umwandlung der Daten (aus Martin.R ‚s Antwort genommen here):
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 Empfängerseite:
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 vor und zurück konvertieren kann und Sound von ihm vor dem Streamen es (auf dem gleichen Telefon) aber nicht den AVAudioPCMBuffer auf der Empfängerseite erstellen kann. Weiß jemand, warum die Konvertierung auf der Empfängerseite nicht funktioniert? Ist das der richtige Weg?
Jede Hilfe, Gedanken/Eingabe dazu wäre sehr willkommen.
können Sie einen Hinweis geben, wie Audio-Queue oder jedes Beispielprojekt zu verwenden? –
Nein, ich kann nicht fürchte ich. – nullforlife