我遇到了一个问题,需要对来自麦克风的音频进行下采样。我使用AVAudioEngine从麦克风中获取样本,以下是相关代码:
这段代码在iPhone 5s上表现良好,因为麦克风输入为8000Hz,并且缓冲区被麦克风的数据填充。问题是我想从iPhone 6s(及以上版本)进行录制,其麦克风记录为16000Hz。如果我将混音器节点连接到引擎的主混音器节点中(使用以下代码),情况就变得奇怪了:
assert(self.engine.inputNode != nil)
let input = self.engine.inputNode!
let audioFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 8000, channels: 1, interleaved: false)
let mixer = AVAudioMixerNode()
engine.attach(mixer)
engine.connect(input, to: mixer, format: input.inputFormat(forBus: 0))
do {
try engine.start()
mixer.installTap(onBus: 0, bufferSize: 1024, format: audioFormat, block: {
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
//some code here
})
} catch let error {
print(error.localizedDescription)
}
这段代码在iPhone 5s上表现良好,因为麦克风输入为8000Hz,并且缓冲区被麦克风的数据填充。问题是我想从iPhone 6s(及以上版本)进行录制,其麦克风记录为16000Hz。如果我将混音器节点连接到引擎的主混音器节点中(使用以下代码),情况就变得奇怪了:
engine.connect(mixer, to: mainMixer, format: audioFormat)
这个方法实际上是可行的,我得到的缓冲区格式为8000Hz,声音经过完美的下采样处理,唯一的问题是声音也从扬声器中输出,而我不希望如此(如果我不连接它,缓冲区为空)。
有人知道如何解决这个问题吗?
非常感谢任何帮助、意见或想法。