Как я могу заставить AVAudioEngine выводить PCM-16 с микрофона?

Я использую AVAudioEngine и пытаюсь заставить его выводить .pcmFormatInt16 на частоте 16000 Гц, но не могу заставить его работать. Вот что я делаю:

let audioEngine = AVAudioEngine()
let mixer = AVAudioMixerNode()
let input = self.audioEngine.inputNode!

audioEngine.attach(mixer)
audioEngine.connect(input, to: mixer, format: input.outputFormat(forBus: 0))

let recordingFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 16000.0, channels: 1, interleaved: true)

mixer.installTap(onBus: 0, bufferSize: 2048, format: recordingFormat) { [weak self] (buffer, _) in
    // buffer here is all 0's!
}

self.audioEngine.prepare()
try! self.audioEngine.start()

Как отмечалось выше, когда я обращаюсь к буферу, всегда все 0, тишина.


person Joe    schedule 05.11.2017    source источник


Ответы (1)


AVAudioEngine не поддерживает изменение частоты дискретизации. Вы можете использовать AVAudioConverter для изменения частоты дискретизации, как это

let inputFormat = input.outputFormat(forBus: 0)
let recordingFormat = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 16000.0, channels: 1, interleaved: true)
converter = AVAudioConverter(from: inputFormat, to: recordingFormat)

mixer.installTap(onBus: 0, bufferSize: 2048, format: inputFormat) { [weak self] (buffer, _) in
    let convertedBuffer = self?.converter.convertBuffer(additionalBuffer: buffer)
}
person woosiki    schedule 06.11.2017
comment
Вы можете изменить частоту дискретизации, просто изменив формат соединения, но не все форматы поддерживаются таким образом. - person dave234; 07.11.2017
comment
Если вы меняете частоту дискретизации по формату подключения, это выглядит как измененная частота дискретизации, но в звуке есть шум. Например, при изменении частоты дискретизации с 48000 на 44100 в iPhone6 ​​буферизация звука идет медленнее, чем запись. - person woosiki; 07.11.2017