【问题标题】:I want to change the sample rate from my input node from 44100 to 8000我想将输入节点的采样率从 44100 更改为 8000
【发布时间】:2017-04-10 20:15:53
【问题描述】:

我想将麦克风中的缓冲区读入一个数组,44.1khz 工作正常,但采样率为 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
    }

}

有人可以帮忙吗?

【问题讨论】:

  • 你的意思是 441Khz 还是 44.1 khz?

标签: audio swift3 buffer avfoundation xcode8


【解决方案1】:

更新答案这个答案曾经尝试用水龙头和混音器对转换进行评分,但不起作用。

您可以使用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()
}

【讨论】:

  • 谢谢你的好答案,但没有任何改变......我仍然得到了 4100 Hz 的缓冲区。我检查了混音器的输入格式,它仍然是 4100 Hz。
  • 抱歉,已修复
  • 我现在有这个错误:kAudioUnitErr_TooManyFramesToProcess : inFramesToProcess=1024, mMaxFramesPerSlice=768
  • 我没用过AKPlayer,但是你绝对可以用AVAudioConverter轻松做采样率转换。现在我看了一下,我认为转换器代码应该有一个标志来阻止AVAudioConverterInputBlock 多次返回相同的缓冲区。
  • 这里的 fmt 是什么?
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2013-10-25
  • 2015-07-13
相关资源
最近更新 更多