AudioQueueStart 在 iOS 7 的后台进程中失败并显示 -16981

Posted

技术标签:

【中文标题】AudioQueueStart 在 iOS 7 的后台进程中失败并显示 -16981【英文标题】:AudioQueueStart fails with -16981 from background process on iOS 7 【发布时间】:2013-09-22 19:24:01 【问题描述】:

在所有以前版本的操作系统上的 ios 应用程序中,我们偶尔会录制音频,然后休眠一段时间,然后再次录制,然后永远循环(休眠是为了保持电池电量)。即使应用程序在后台,这在 iOS 7 之前都可以正常工作。现在,当应用程序处于后台时,对 AudioQueueStart 的调用无法开始录制,并出现错误:-16981。我似乎在文档或网络上找不到这个错误代码,如果我把它变成一个 NSError,它会说“操作无法完成。(OSStatus 错误 -16981。)”,这是'没什么帮助。

我有一个理论,Apple 在这里关闭了一个漏洞;想法是;你为什么要从后台进程开始录制,除非你是间谍?好吧,在用户同意的情况下(签名并付费!),​​这正是我们正在做的事情。

所以;任何人都可以确认或否认这是预期的,或者我可以做些什么。这对我们的应用程序来说是一个杀手。我已将其作为错误提交给 Apple,并将尝试在此处报告进度。

更新:2013 年 10 月 3 日

虽然之前的答案似乎暂时适用于此;它现在已停止使用 -12985,这是因为另一个应用程序已打开音频。这当然是我需要使用混合标志的原因。

更新:

iOS 7.0.3(及更高版本)似乎已经完全解决了这个问题。

【问题讨论】:

真的吗?这是一个编程问题,而 AskDifferent 似乎更适合高级用户而不是开发人员。我希望有人可能知道 AudioQueueStart 函数中的 -16981 可能意味着什么,以及如何修复它。 我对 iOS 不熟悉,但如果操作系统发生变化,我认为您会在 apple@stackexhange 获得更有效的帮助。但是怪我糟糕的英语水平。我误解了该页面也是针对软件相关问题的部分。 在 iOS 7 上遇到同样的问题。 如果您可以列出一些您用来说明如何调用 AudioQueueStart 的代码 - 我们或许可以提供一种解决方法,或者至少确认我们看到的错误与您相同。 Apple 在 iOS 7.0.3 中修复了这个问题 【参考方案1】:

在播放不同的音频会话属性后,我发现启用 kAudioSessionProperty_OverrideCategoryMixWithOthers (TRUE) 时会出现 -16981 错误。一旦我将其设置为“0”,AudioQueueStart() 就会成功执行。因此,在开始音频会话之前尝试:

UInt32 allowMixing = 0;
status = AudioSessionSetProperty (
                      kAudioSessionProperty_OverrideCategoryMixWithOthers,
                      sizeof (allowMixing),
                      &allowMixing);

显然,这是 iOS 7 中的行为变化。如前所述,文档没有列出 -16981 错误代码。

【讨论】:

干得好;那行得通。看起来它是一个真正的错误,所以我将信息添加到 Apple 错误中。 自从尝试了这个,我当然发现在一般情况下我们确实需要混合,所以虽然我可以在 iOS 7 上优雅地退化以关闭它,如果我无法打开音频背景,这仍然是 Apple 代码中的一个非常大的错误,我仍在处理他们的问题 这方面有什么进展吗?我正在开发一个 MIDI 应用程序,即使在后台也可以发送 MIDI 时钟消息。它在 iOS 6 中运行良好,但在 iOS7 中,它在最小化时将不再运行。我正在使用 Xamarin,所以我不确定这是 Apple 错误还是 Xamarin 错误,因此您可以提供任何进一步的细节将不胜感激..

以上是关于AudioQueueStart 在 iOS 7 的后台进程中失败并显示 -16981的主要内容,如果未能解决你的问题,请参考以下文章

在 iphone4 中打电话后 AudioQueueStart 失败

音频队列:AudioQueueStart 返回 -50

使用 AudioQueueStart() 时的延迟

AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)

iPad 上的 AudioQueueStart() 问题

AudioQueueStart 返回错误代码 -50