gpt4 book ai didi

swift - AVAudioEngine 下采样问题

转载 作者:可可西里 更新时间:2023-11-01 02:14:28 27 4
gpt4 key购买 nike

我在对从麦克风获取的音频进行下采样时遇到问题。我正在使用 AVAudioEngine 通过以下代码从麦克风中采集样本:

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,并且缓冲区中充满了来自麦克风的数据。

问题是我希望能够从麦克风以 16000Hz 录制的 iPhone 6s(及更高版本)进行录制。奇怪的是,如果我将 mixernode 与引擎 mainmixernode 连接(使用以下代码):

engine.connect(mixer, to: mainMixer, format: audioFormat)

这确实有效,我得到的缓冲区具有 8000Hz 的格式,并且声音经过完美的下采样,唯一的问题是声音也来 self 不想要的扬声器(如果我不想要连接它缓冲区是空的)。

有谁知道如何解决这个问题?

非常感谢任何帮助、意见或想法。

最佳答案

另一种方法,在 Swift 5

中使用 AVAudioConverter
let engine = AVAudioEngine()


func setup() {

let input = engine.inputNode
let bus = 0
let inputFormat = input.outputFormat(forBus: bus )
guard let outputFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 8000, channels: 1, interleaved: true), let converter = AVAudioConverter(from: inputFormat, to: outputFormat) else{
return
}

input.installTap(onBus: bus, bufferSize: 1024, format: inputFormat) { (buffer, time) -> Void in
var newBufferAvailable = true

let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
if newBufferAvailable {
outStatus.pointee = .haveData
newBufferAvailable = false
return buffer
} else {
outStatus.pointee = .noDataNow
return nil
}
}

if let convertedBuffer = AVAudioPCMBuffer(pcmFormat: outputFormat, frameCapacity: AVAudioFrameCount(outputFormat.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate)){
var error: NSError?
let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)
assert(status != .error)

// 8kHz buffers
print(convertedBuffer.format)
}
}
do {
try engine.start()
} catch { print(error) }
}

关于swift - AVAudioEngine 下采样问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39595444/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com