2017-03-29 1 views
0

내가 잠시 내 응용 프로그램의 모든 요소를 ​​통해 이동합니다 말더듬/터링되는 스트림을 통해 재생되는 :오디오는

나는 AVAudioPCMBuffer 오디오 기록하는 응용 프로그램이 있습니다. 이 버퍼는 NSData로 변환 된 다음 [UInt8]로 변환됩니다. 그런 다음 OutputStream을 통해 스트리밍됩니다. 다른 장치에서이 데이터는 InputStream을 사용하여 수신됩니다. 그런 다음 NSData로 변환되고 다시 AVAudioPCMBuffer로 변환됩니다. 그런 다음이 버퍼가 재생됩니다.

문제는 오디오가 매우 불안하고 음성을 낼 수 없다는 것입니다. 다른 사람이 이야기하고 있는지에 따라 오디오가 크게 또는 작게됩니다. 나는 몇 초 동안이 오디오 재생을 지연하고, 그러나 그것은 도움이되지 않았다,이 오디오 명확하게 할 것으로 기대, 그것은을했다

self.peerAudioPlayer.scheduleBuffer(audioBuffer, completionHandler: nil) 

:


버퍼를 예약 할 때. 내 최고의 추측은 내가 만들고있는 버퍼가 어떻게 든 오디오의 일부를 잘라 버린다는 것이다.

다음

가 어떻게 오디오를 녹음 할 수 있습니다 : :

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

     let data = self.audioBufferToNSData(PCMBuffer: buffer) 
     let output = self.outputStream!.write(data.bytes.assumingMemoryBound(to: UInt8.self), maxLength: data.length) 
    } 

audioBufferToNSData 단지을 NSData에 AVAudioPCMBuffer 변환하는 방법이며 여기있다 :

func audioBufferToNSData(PCMBuffer: AVAudioPCMBuffer) -> NSData { 
    let channelCount = 1 // given PCMBuffer channel count is 1 
    let channels = UnsafeBufferPointer(start: PCMBuffer.floatChannelData, count: channelCount) 
    let data = NSData(bytes: channels[0], length:Int(PCMBuffer.frameCapacity * PCMBuffer.format.streamDescription.pointee.mBytesPerFrame)) 

    return data 
} 

나는 그래서 나는 당신에게 내 관련 코드가 표시됩니다 문제가 위의 방법에있을 수 있는지 궁금합니다. 아마도 NSData 객체의 길이를 계산할 때 어쩌면 오디오의 일부를 잘라낼 수도 있습니다. 수신 측에


나는이 있습니다

case Stream.Event.hasBytesAvailable: 
     DispatchQueue.global().async { 
      var tempBuffer: [UInt8] = .init(repeating: 0, count: 17640) 
      let length = self.inputStream!.read(&tempBuffer, maxLength: tempBuffer.count) 

      self.testBufferCount += length 
      self.testBuffer.append(contentsOf: tempBuffer) 

      if (self.testBufferCount >= 17640) { 

       let data = NSData.init(bytes: &self.testBuffer, length: self.testBufferCount) 
       let audioBuffer = self.dataToPCMBuffer(data: data) 

       self.peerAudioPlayer.scheduleBuffer(audioBuffer, completionHandler: nil) 

       self.testBuffer.removeAll() 
       self.testBufferCount = 0 
      } 
     } 

전송되는 데이터가 정확히 17,640 바이트, 그래서 내가 전에이 모든 데이터를 얻을 필요가 있기 때문에 나는 17640을 확인 이유는 그것을해라.

또한 dataToPCMBuffer 메서드는 NSData를 AVAudioPCMBuffer로 변환하기 때문에 재생할 수 있습니다. 그 방법은 다음과 같습니다.

func dataToPCMBuffer(data: NSData) -> AVAudioPCMBuffer { 
    let audioFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 1, interleaved: false) // given NSData audio format 
    let audioBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat, frameCapacity: UInt32(data.length)/audioFormat.streamDescription.pointee.mBytesPerFrame) 
    audioBuffer.frameLength = audioBuffer.frameCapacity 
    let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: Int(audioBuffer.format.channelCount)) 
    data.getBytes(UnsafeMutableRawPointer(channels[0]) , length: data.length) 
    return audioBuffer 
} 

미리 감사드립니다!

답변

0

저는 audioBufferToNSData에서 frameCapacity 대신 프레임 길이를 사용해야한다고 생각합니다.

let data = NSData(bytes: channels[0], length:Int(PCMBuffer.frame​Length * PCMBuffer.format.streamDescription.pointee.mBytesPerFrame))

PCMBuffer.frameCapacity -> 얼마나 많은 PCMBuffer.frame 길이를 저장할 수 있습니다 -> 나는 그것이 작동하는지 확인하기 위해 노력할 것 실제 유효한 데이터

+0

얼마나 PCMBuffer.frameCapacity의, 그러나, 나는 이전에이 값들을 출력했고 그들은 동일했다 (둘 다 4410). 또한 실제로 오디오를 기본적으로 녹음하고 NSData에 AVAudioPCMBuffer로 변환 한 후 NSData를 AVAudioPCMBuffer로 다시 변환하고 오디오를 재생하는 테스트 프로젝트를 만들었습니다. 나는 내 변환을 테스트하기 위해 이것을 만들었고 오디오는 정상적으로 재생되었습니다. – Kember

+0

그래서 이것을 시도하고 불행히도 작동하지 않습니다. 그러나 문제를 조사하는데 도움을 주셔서 감사합니다. – Kember

관련 문제