标题中描述的方案将产生以下错误:
由于未捕获的异常而终止应用程序 'com.apple.coreaudio.avfaudio',原因:'所需条件为假: IsFormatSampleRateAndChannelCountValid(format)
在那之后,我被遗弃到应用程序委托中,而在发生问题的过程中得不到太多帮助。
我熟悉正确结束音频会话的需要,但是在我的特定情况下,这会在开始会话时发生,尤其是在这里:
node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
request.append(buffer)
}
答案 0 :(得分:0)
通过将我的函数追溯到这一行可以看到这里的罪魁祸首:
let recordingFormat = node.outputFormat(forBus: bus)
由于麦克风已分配给另一个应用程序(在我的情况下为Facetime),因此无法访问发生崩溃的问题中张贴的功能。
我发现,通过监视采样率,可以确定是否可以独占访问它。
if recordingFormat.sampleRate == 0.0 {
throw(MyAwesomeError.audioInUse)
}
值为0.0时,它正在使用中。当值为44100.0时,我就是经商。
通过将上述检查放在node.installTap(...)
函数之前,我可以安全地避免崩溃,然后使用现有的错误处理代码将这种情况通知用户。
将所有内容放在一起,就像这样:
let recordingFormat = node.outputFormat(forBus: bus)
if recordingFormat.sampleRate == 0.0 {
throw(MyAwesomeError.audioInUse)
}
node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
request.append(buffer)
}