我想将输入节点的采样率从44100更改为8000

问题描述 投票:4回答:1

我想从我的麦克风中读取缓冲区到一个数组,其工作频率为441khz,但采样率为8khz时出现错误

ERROR:    >avae> AVAudioIONodeImpl.mm:884: SetOutputFormat: required condition is false: format.sampleRate == hwFormat.sampleRate
2016-11-26 19:32:40.674 Atem[5800:1168274] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: format.sampleRate == hwFormat.sampleRate'

使用我的以下代码:

 var engine = AVAudioEngine()
    func setup() {

    print("new")
    let input = engine.inputNode!
    let bus = 0

    let mixer = AVAudioMixerNode()
    engine.attach(mixer)

    engine.connect(input, to: mixer, format: input.outputFormat(forBus: 0))
    //pcmFormatFloat64 -- pcmFormatFloat32
    print(engine.isRunning)
    let fmt = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 12000, channels: 1, interleaved: true)

    do {
        try engine.start()


     print(engine.isRunning)

        mixer.installTap(onBus: bus, bufferSize: 1024, format: fmt) { (buffer, time) -> Void in
            // 8kHz buffers!
            print(buffer.format)
        }
    }catch {
        //print("An error occurred \(error)")
        return
    }

}

有人可以帮忙吗?

audio swift3 buffer avfoundation xcode8
1个回答
5
投票

[更新后的答案此答案用于尝试使用水龙头和混频器对转换进行评分,此方法不起作用。您可以使用AVAudioConverterAVAudioEngine inputNode上进行速率转换:

let engine = AVAudioEngine() func setup() { let input = engine.inputNode let bus = 0 let inputFormat = input.outputFormat(forBus: 0) let outputFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 8000, channels: 1, interleaved: true)! let converter = AVAudioConverter(from: inputFormat, to: outputFormat)! input.installTap(onBus: bus, bufferSize: 512, 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 } } 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) } try! engine.start() }

© www.soinside.com 2019 - 2024. All rights reserved.