【问题标题】:AVAudioRecorder settings empty after constructor call构造函数调用后 AVAudioRecorder 设置为空
【发布时间】:2015-10-14 16:17:17
【问题描述】:

我正在尝试使用麦克风和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
}

有人可以帮助我吗?是bug吗?

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

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

它在这一行崩溃了:

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

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

【问题讨论】:

    标签: ios swift avaudiorecorder avaudiosession


    【解决方案1】:

    我不确定您为什么要检查设置属性,但是 来自AVAudioRecorder 头文件,在settings 属性上:

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

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

    AVEncoderBitRateKey: NSNumber(integer: 64000)
    

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

    【讨论】:

    • 糟糕!我编辑了我的帖子,我只为帖子测试了一个断言,我的整个代码是不同的。谢谢,我现在测试你的解决方案!
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2021-11-23
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多