构造函数调用后AVAudioRecorder设置为空

时间:2015-10-14 16:17:18

标签: ios swift avaudiorecorder avaudiosession

我正在尝试使用麦克风和AVAudioRecorder录制音频。

适用于 iOS 8 ,但我的代码在 iOS 9 上不再有效。

recordSettings字典设置正确,然后我把它给了 AVAudioRecorder:URL:settings构造函数。

但是,在recorder.settings为空之后,会抛出断言失败

let recordSettings: [String: AnyObject] = [
            AVNumberOfChannelsKey: NSNumber(integer: 2),
            AVFormatIDKey: NSNumber(integer: Int(kAudioFormatMPEG4AAC)),
            AVEncoderBitRateKey: NSNumber(integer: 64)]

var recorder: AVAudioRecorder!
do {
     recorder = try AVAudioRecorder(URL: tempURL, settings:recordSettings) // recordSettings.count = 3
     assert(recorder.settings.count != 0, "Audio Recorder does not provide settings") // assertion failure threw
} catch let error as NSError {
     print("error when intitializing recorder: \(error)")
     return
}

任何人都可以帮助我吗?这是一个错误吗?

编辑:在我的整个代码中,我之后没有测试recorder.settings。我像上面的代码一样实例化记录器,然后我就这样做了:

recorder.delegate = self
recorder.prepareToRecord()
recorder.meteringEnabled = true

它在这一行崩溃了:

for i in 1...(recorder.settings[AVNumberOfChannelsKey] as! Int) {
    ...
}

崩溃是因为recorder.settings[AVNumberOfChannelsKey]nil

1 个答案:

答案 0 :(得分:1)

我不确定你为什么要检查设置属性,但是 来自AVAudioRecorder标题文件,settings属性:

  

这些设置仅在调用prepareToRecord时完全有效

所以你必须首先调用prepareToRecord()但它会失败/返回false,因为你的比特率太低了!它的单位是每秒位数,而不是每秒千位:

AVEncoderBitRateKey: NSNumber(integer: 64000)

这适用于iOS 8,因为太低的比特率被简单地丢弃了。看起来它在iOS 9中出现了错误。