2017-03-09 2 views
0

ich die Aufzeichnung von Audio die mit folgenden:Audio vom Mikrofon abgespielten ist abgehackt und es klingt wie Luft in das Mikrofon bläst

localInput?.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) { 
     (buffer, time) -> Void in 

     let audioBuffer = self.audioBufferToBytes(audioBuffer: buffer) 
     let output = self.outputStream!.write(audioBuffer, maxLength: Int(buffer.frameLength)) 

     if output > 0 { 
      print("\(#file) > \(#function) > \(output) bytes written from queue \(self.currentQueueName())") 
     } 
     else if output == -1 { 
      let error = self.outputStream!.streamError 
      print("\(#file) > \(#function) > Error writing to stream: \(error?.localizedDescription)") 
     } 
    } 

Wo ist mein localInputFormat ist folgende:

self.localInput = self.localAudioEngine.inputNode 
self.localAudioEngine.attach(self.localAudioPlayer) 
self.localInputFormat = self.localInput?.inputFormat(forBus: 0) 
self.localAudioEngine.connect(self.localAudioPlayer, to: self.localAudioEngine.mainMixerNode, format: self.localInputFormat) 

Die Funktion audioBufferToBytes ist wie folgt:

func audioBufferToBytes(audioBuffer: AVAudioPCMBuffer) -> [UInt8] { 
    let srcLeft = audioBuffer.floatChannelData![0] 
    let bytesPerFrame = audioBuffer.format.streamDescription.pointee.mBytesPerFrame 
    let numBytes = Int(bytesPerFrame * audioBuffer.frameLength) 

    // initialize bytes by 0 
    var audioByteArray = [UInt8](repeating: 0, count: numBytes) 

    srcLeft.withMemoryRebound(to: UInt8.self, capacity: numBytes) { srcByteData in 
     audioByteArray.withUnsafeMutableBufferPointer { 
      $0.baseAddress!.initialize(from: srcByteData, count: numBytes) 
     } 
    } 

    return audioByteArray 
} 

Auf dem anderen Gerät, wenn ich die Daten erhalte Ich muss es zurück konvertieren. So, wie sie empfangen hat es zieht sich durch die folgenden:

func bytesToAudioBuffer(_ buf: [UInt8]) -> AVAudioPCMBuffer { 

    let fmt = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 1, interleaved: true) 
    let frameLength = UInt32(buf.count)/fmt.streamDescription.pointee.mBytesPerFrame 

    let audioBuffer = AVAudioPCMBuffer(pcmFormat: fmt, frameCapacity: frameLength) 
    audioBuffer.frameLength = frameLength 

    let dstLeft = audioBuffer.floatChannelData![0] 

    buf.withUnsafeBufferPointer { 
     let src = UnsafeRawPointer($0.baseAddress!).bindMemory(to: Float.self, capacity: Int(frameLength)) 
     dstLeft.initialize(from: src, count: Int(frameLength)) 
    } 

    return audioBuffer 
} 

Und schließlich spielen wir diese Audiodaten:

   self.audioPlayerQueue.async { 
        self.peerAudioPlayer.scheduleBuffer(audioBuffer) 

        if (!self.peerAudioPlayer.isPlaying && self.localAudioEngine.isRunning) { 
         self.peerAudioPlayer.play() 
        } 
       } 

jedoch auf beiden Lautsprecher ich nur hören, was wie jemand, klingt das Mikrofon jede halbe Klopfen -zweiter (ish). Nicht dass sie wirklich reden oder so. Ich stelle mir vor, dass dies aufgrund meiner Umwandlung von einem Audiopuffer in Bytes und zurück ist, aber ich bin mir nicht sicher. Sieht jemand irgendwelche Probleme mit dem oben genannten?

Danke.

Antwort

0

Wenn jemand an der Lösung interessiert ist, war das Problem im Grunde, dass das Audio auf dem Aufnahmegerät 17640 Bytes war, aber um es zu streamen, es zerbrach es in kleinere Stücke, und auf dem Empfangsgerät musste ich das erste lesen 17640 Bytes und DANN spielen den Ton. Nicht jede kleine Datenmenge, die empfangen wurde.