将 AVAudioPCMBuffer 写入压缩的 AVAudioFile

Posted

技术标签:

【中文标题】将 AVAudioPCMBuffer 写入压缩的 AVAudioFile【英文标题】:Writing AVAudioPCMBuffer into an AVAudioFile compressed 【发布时间】:2019-02-06 06:02:51 【问题描述】:

我们正在开发一个可以记录和保留麦克风输入的应用程序。不能使用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(在我们的例子中较低的质量是可以接受的),但输出的大小在大小上是不可接受的。

录音包含大量背景噪音。

有什么建议吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

“.wav”文件格式出现错误。我应该改用什么设置? (***.com/questions/42344757/…) 这是我得到的错误。即使我采用文件路径 url。

以上是关于将 AVAudioPCMBuffer 写入压缩的 AVAudioFile的主要内容,如果未能解决你的问题,请参考以下文章

将 pcm 加载到 AVAudioPCMBuffer

使用 AVAudioEngine 从 AVAudioPCMBuffer 播放音频

使用 Swift 中的 Accelerate 框架来自 AVAudioPCMBuffer 的频谱图

访问 AVAudioPCMBuffer 的浮点样本进行处理

关于从 AVAudioPCMBuffer 中提取声压级

在同一个 AVAudioPCMBuffer 中改变正弦波频率