Запись AVAudioPCMBuffer в сжатый AVAudioFile - PullRequest
0 голосов
/ 31 августа 2018

Мы работаем над приложением, которое записывает и сохраняет микрофонный ввод. Использование AVAudioRecorder не было возможным, поскольку требуется обработка звука в реальном времени.

AVAudioEngine используется потому, что обеспечивает низкоуровневый доступ к входному аудио.

let audioEngine  = AVAudioEngine()
let inputNode = audioEngine.inputNode
let inputFormat = inputNode.inputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: AVAudioFrameCount(inputFormat.sampleRate * sampleInterval), format: inputFormat) { (buffer: AVAudioPCMBuffer, time: AVAudioTime) -> Void in
    // sound preprocessing
    // writing to audio file
    audioFile.write(buffer.floatChannelData![0])
})

Наша проблема в том, что запись довольно большая. Для 5-часовой записи выходной аудиофайл имеет размер 1,2 ГБ в формате .caf.

let audioFile = AVAudioFile(forWriting: recordingPath, settings: [:], commonFormat: .pcmFormatFloat32, interleaved: isInterleaved)

Есть ли хороший способ сжать запись аудиофайла в него?

Частота дискретизации по умолчанию - 44100 Гц. Мы будем использовать AVAudioMixerNode для уменьшения входного сигнала до 20 кГц (в нашем случае приемлемо более низкое качество), но размер выходного сигнала не будет приемлемым по размеру.

Запись содержит большие сегменты фонового шума.

Есть предложения?

1 Ответ

0 голосов
/ 01 сентября 2018

Формат контейнера .caf поддерживает сжатие AAC. Включите его, установив для словаря настроек AVAudioFile значение [AVFormatIDKey: kAudioFormatMPEG4AAC]:

let audioFile = try! AVAudioFile(forWriting: recordingPath, settings: [AVFormatIDKey: kAudioFormatMPEG4AAC], commonFormat: .pcmFormatFloat32, interleaved: isInterleaved)

Существуют и другие ключи настроек, которые влияют на размер и качество файла: AVSampleRateKey, AVEncoderBitRateKey и AVEncoderAudioQualityKey.

p.s. вам нужно закрыть файл .caf, когда вы закончите с ним. AVAudioFile не имеет явного close() метода, поэтому вы неявно закрываете его, удаляя любые ссылки на него. Несжатые .caf файлы могут воспроизводиться без этого, но файлы AAC - нет.

...