Запись AVAudioPCMBuffer в сжатый AVAudioFile

Мы работаем над приложением, которое записывает и сохраняет ввод с микрофона. Использование 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 ответ

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

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

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

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

Другие вопросы по тегам