내가 잠시 내 응용 프로그램의 모든 요소를 통해 이동합니다 말더듬/터링되는 스트림을 통해 재생되는 :오디오는
나는 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
}
미리 감사드립니다!
얼마나 PCMBuffer.frameCapacity의, 그러나, 나는 이전에이 값들을 출력했고 그들은 동일했다 (둘 다 4410). 또한 실제로 오디오를 기본적으로 녹음하고 NSData에 AVAudioPCMBuffer로 변환 한 후 NSData를 AVAudioPCMBuffer로 다시 변환하고 오디오를 재생하는 테스트 프로젝트를 만들었습니다. 나는 내 변환을 테스트하기 위해 이것을 만들었고 오디오는 정상적으로 재생되었습니다. – Kember
그래서 이것을 시도하고 불행히도 작동하지 않습니다. 그러나 문제를 조사하는데 도움을 주셔서 감사합니다. – Kember