将AVAudioPCMBuffer写入压缩的AVAudioFile中

时间:2018-08-31 08:31:46

标签: ios swift avfoundation 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小时的录音,输出的音频文件为.caf格式的1.2GB。

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

是否有压缩音频文件的好方法?

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

录音包含很大的背景噪音。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

p.s。完成操作后,您需要关闭.caf文件。 AVAudioFile没有显式的close()方法,因此您可以通过取消对它的任何引用来隐式关闭它。没有此功能,未压缩的.caf文件似乎可以播放,但AAC文件不能播放。