Запись 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 - нет.