【发布时间】:2020-03-16 19:12:44
【问题描述】:
我正在尝试将输入音频从 44.1 kHz 重新采样到 48 kHz。
- 使用AudioToolbox的
AUAudioUnit.inputHandler - 将输入的 44.1 kHZ 写入 wav 文件(效果很好)
- 将 44.1 kHz 转换为 48 kHz 并将转换后的字节写入文件。 https://developer.apple.com/documentation/audiotoolbox/1503098-audioconverterfillcomplexbuffer
问题出在第三步。写入文件后,声音非常嘈杂。 这是我的代码:
// convert to 48kHz
var audioConverterRef: AudioConverterRef?
CheckError(AudioConverterNew(&self.hardwareFormat,
&self.convertingFormat,
&audioConverterRef), "AudioConverterNew failed")
let outputBufferSize = inNumBytes
let outputBuffer = UnsafeMutablePointer<Int16>.allocate(capacity: MemoryLayout<Int16>.size * Int(outputBufferSize))
let convertedData = AudioBufferList.allocate(maximumBuffers: 1)
convertedData[0].mNumberChannels = self.hardwareFormat.mChannelsPerFrame
convertedData[0].mDataByteSize = outputBufferSize
convertedData[0].mData = UnsafeMutableRawPointer(outputBuffer)
var ioOutputDataPackets = UInt32(inNumPackets)
CheckError(AudioConverterFillComplexBuffer(audioConverterRef!,
self.coverterCallback,
&bufferList,
&ioOutputDataPackets,
convertedData.unsafeMutablePointer,
nil), "AudioConverterFillComplexBuffer error")
let convertedmData = convertedData[0].mData!
let convertedmDataByteSize = convertedData[0].mDataByteSize
// Write converted packets to file -> audio_unit_int16_48.wav
CheckError(AudioFileWritePackets(self.outputFile48000!,
false,
convertedmDataByteSize,
nil,
recordPacket,
&ioOutputDataPackets,
convertedmData), "AudioFileWritePackets error")
转换回调体在这里:
let buffers = UnsafeMutableBufferPointer<AudioBuffer>(start: &bufferList.mBuffers, count: Int(bufferList.mNumberBuffers))
let dataPtr = UnsafeMutableAudioBufferListPointer(ioData)
dataPtr[0].mNumberChannels = 1
dataPtr[0].mData = buffers[0].mData
dataPtr[0].mDataByteSize = buffers[0].mDataByteSize
ioDataPacketCount.pointee = buffers[0].mDataByteSize / UInt32(MemoryLayout<Int16>.size)
示例项目在这里:https://drive.google.com/file/d/1GvCJ5hEqf7PsBANwUpVTRE1L7S_zQxnL/view?usp=sharing
【问题讨论】:
-
"将 44.1 kHz 转换为 48 kHz" 我认为问题在于您没有转换它。你只是说采样率是 48kHz,但它是 44.1kHz——所以你会得到蹩脚的声音。重采样是一项复杂的业务,我的印象是您根本没有这样做。当然,我可能完全错了!但这是我的总体印象。如果有的话,请带上一粒盐。
-
AudioConverterFillComplexBuffer 是否应该完成这项工作?
标签: swift core-audio pcm audiotoolbox sample-rate