无法在 iOS 上以后台模式重新启动中断的音频输入队列
我正在编写一个使用 AudioQueue 进行录音的 iOS 应用程序。我创建了一个配置为获取线性 PCM 的输入队列,声明此队列并且一切按预期工作。
为了管理中断,我实现了 AVAudioSession 的委托方法来捕获中断的开始和结束。 endInterruption 方法如下所示:
- (void)endInterruptionWithFlags:(NSUInteger)flags;
{
if (flags == AVAudioSessionInterruptionFlags_ShouldResume && audioQueue != 0) {
NSLog(@"Current audio session - category: '%@' mode: '%@'",
[[AVAudioSession sharedInstance] category],
[[AVAudioSession sharedInstance] mode]);
NSError *error = nil;
OSStatus errorStatus;
if ((errorStatus = AudioSessionSetActive(true)) != noErr) {
error = [self errorForAudioSessionServiceWithOSStatus:errorStatus];
NSLog(@"Could not reactivate the audio session: %@",
[error localizedDescription]);
} else {
if ((errorStatus = AudioQueueStart(audioQueue, NULL)) != noErr) {
error = [self errorForAudioQueueServiceWithOSStatus:errorStatus];
NSLog(@"Could not restart the audio queue: %@",
[error localizedDescription]);
}
}
}
// ...
}
如果应用程序在前台时被中断,则一切正常。如果中断发生在后台,就会出现问题。激活音频会话会导致错误 !cat:
指定的音频会话类别不能用于尝试的音频操作。例如,您尝试在音频会话类别设置为 kAudioSessionCategory_AudioProcessing 的情况下播放或录制音频。
启动队列而不激活会话会导致错误代码:-12985
此时,类别设置为 AVAudioSessionCategoryPlayAndRecord,模式为 AVAudioSessionModeDefault 。
我找不到此错误消息的任何文档,也找不到是否可以在后台重新启动输入音频队列。
I'm writing an iOS App using an AudioQueue for recording. I create an input queue configured to get linear PCM, stated this queue and everything works as expected.
To manage interruptions, I implemented the delegate methods of AVAudioSession to catch the begin and the end of an interruption. The method endInterruption looks like the following:
- (void)endInterruptionWithFlags:(NSUInteger)flags;
{
if (flags == AVAudioSessionInterruptionFlags_ShouldResume && audioQueue != 0) {
NSLog(@"Current audio session - category: '%@' mode: '%@'",
[[AVAudioSession sharedInstance] category],
[[AVAudioSession sharedInstance] mode]);
NSError *error = nil;
OSStatus errorStatus;
if ((errorStatus = AudioSessionSetActive(true)) != noErr) {
error = [self errorForAudioSessionServiceWithOSStatus:errorStatus];
NSLog(@"Could not reactivate the audio session: %@",
[error localizedDescription]);
} else {
if ((errorStatus = AudioQueueStart(audioQueue, NULL)) != noErr) {
error = [self errorForAudioQueueServiceWithOSStatus:errorStatus];
NSLog(@"Could not restart the audio queue: %@",
[error localizedDescription]);
}
}
}
// ...
}
If the app gets interrupted while it is in foreground, everything works correct. The problem appears, if the interruption happens in the background. Activating the audio session result in the error !cat:
The specified audio session category cannot be used for the attempted audio operation. For example, you attempted to play or record audio with the audio session category set to kAudioSessionCategory_AudioProcessing.
Starting the queue without activating the session results in the error code: -12985
At that point the category is set to AVAudioSessionCategoryPlayAndRecord and the mode is AVAudioSessionModeDefault.
I couldn't find any documentation for this error message, nor if it is possible to restart an input audio queue in the background.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是的,这是可能的,但要在后台重新激活会话,音频会话必须设置 AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers
或应用程序必须 接收远程控制命令事件:
Yes it is possible, but to reactivate the session in the background, the audio session has to either set AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers
or the app has to receive remote control command events:
目前,如果您处于后台,则无法重新激活。
At the present there is no way to reactivate if you are in the background.
你的应用程序支持 info.plist 中的后台吗?我不确定是否可以在后台录制,但您可能需要添加“必需的后台模式”,然后添加“应用程序播放音频”数组中的值
更新我刚刚检查并录制在后台是可能的。
Have you made your app support backgrounding in the info.plist? I'm not sure if recording is possible in the background, but you probably need to add "Required Background Modes" and then a value in that array of "App plays audio"
Update I just checked and recording in the background is possible.