将 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.2GB

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

有没有一种很好的方法来压缩写入它的音频文件?

默认采样频率为 44100Hz。我们将使用 AVAudioMixerNode 将输入下采样至 20Khz(在我们的例子中,较低的质量是可以接受的(,但输出的大小在大小上是不可接受的。

录音包含大量背景噪音。

有什么建议吗?

.caf容器格式支持 AAC 压缩。通过将AVAudioFile设置字典设置为[AVFormatIDKey: kAudioFormatMPEG4AAC]来启用它:

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

还有其他设置键会影响文件大小和质量:AVSampleRateKeyAVEncoderBitRateKeyAVEncoderAudioQualityKey.

附言您需要在完成.caf文件后将其关闭。AVAudioFile没有显式close()方法,因此您可以通过对它的任何引用来隐式关闭它。没有这个,未压缩的.caf文件似乎可以播放,但 AAC 文件不是。

最新更新