AVAudioEngine downsample issue

后端 未结 3 888
甜味超标
甜味超标 2020-12-11 06:04

I\'m having an issue with downsampling audio taken from the microphone. I\'m using AVAudioEngine to take samples from the microphone with the following code:



        
3条回答
  •  轮回少年
    2020-12-11 07:05

    An other way to do it , with AVAudioConverter in Swift 5

    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) }
    }
    

提交回复
热议问题