2017-03-09 118 views
0

我使用录制音频以下:音频麦克风从正在播放不连贯和听起来像空气吹进麦克风

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

凡我localInputFormat如下:

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) 

功能audioBufferToBytes如下:

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 
} 

在另一台设备上,当我收到数据我必须将其转换回来。

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 
} 

最后,我们播放音频数据:那么,因为它是收到了通过以下运行

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

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

然而,无论是扬声器我刚刚听到什么声音就像是有人窃听每半麦克风 - 第二(ISH)。不是他们真的在说什么我想这是由于我从一个音频缓冲区转换为字节并返回,但我不确定。有没有人看到上述问题?

感谢。

回答

0

如果有人有兴趣的解决方案,基本的问题是,在记录设备上的音频为17640个字节,但是到流,它打破它成小块,并在接收设备上,我不得不读的第一17640字节,然后播放音频。不要播放收到的每一小部分数据。