在电话通话或 Facetime 会话中,尝试使用语音识别器会使应用崩溃



标题中描述的方案将产生以下错误:

由于未捕获的异常而终止应用 "com.apple.coreaudio.avfaudio",原因:"必需条件为假: IsFormatSampleRateAndChannelCountValid(format(

在那之后,我被转储到应用程序代表中,并且没有对出错的地方提供太多帮助。

我熟悉正确结束音频会话的必要性,但在我的特定情况下,这会在启动会话时发生,特别是在这里:

node.installTap(onBus: bus, bufferSize: 1024, format: recordingFormat) { buffer, _ in
    request.append(buffer)
}

这里的罪魁祸首可以通过将我的函数追溯到这一行来一步看到:

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)
}

最新更新