我正在尝试使用 AVAudioEngine 将来自麦克风的声音与各种音效文件一起录制到 AVAudioFile。
我像这样创建一个 AVAudioFile:
let settings = self.engine.mainMixerNode.outputFormatForBus(0).settings
try self.audioFile = AVAudioFile(forWriting: self.audioURL, settings: settings, commonFormat: .PCMFormatFloat32, interleaved: false)
我在音频引擎的 mainMixerNode 上安装了一个水龙头,在那里我将缓冲区写入文件:
self.engine.mainMixerNode.installTapOnBus(0, bufferSize: 4096, format: self.engine.mainMixerNode.outputFormatForBus(0)) { (buffer, time) -> Void in
do {
try self.audioFile?.writeFromBuffer(buffer)
} catch let error as NSError {
NSLog("Error writing %@", error.localizedDescription)
}
}
我self.engine.mainMixerNode.outputFormatForBus(0).settings
在创建音频文件时使用,因为 Apple 声明“缓冲区格式必须与文件的处理格式匹配,这就是为什么在创建上面的 AVAudioFile 对象时使用 outputFormatForBus: 的原因”。在 installTapOnBus 的文档中,他们还说:“指定总线上的抽头和连接格式(如果非零)应该相同”
但是,这给了我一个非常大的未压缩音频文件。我想将文件另存为 .m4a 但不明白在哪里指定我要使用的设置:
[
AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),
AVSampleRateKey : NSNumber(double: 32000.0), //44100.0
AVNumberOfChannelsKey: NSNumber(int: 1),
AVEncoderBitRatePerChannelKey: NSNumber(int: 16),
AVEncoderAudioQualityKey: NSNumber(int: Int32(AVAudioQuality.High.rawValue))
]
如果我在创建音频文件时传入这些设置,则应用程序会在我录制时崩溃。
关于如何解决这个问题的任何建议或想法?