【问题标题】:Can not restart an interrupted audio input queue in background mode on iOS无法在 iOS 的后台模式下重新启动中断的音频输入队列
【发布时间】:2012-03-05 19:13:12
【问题描述】:

我正在编写一个使用 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

我找不到有关此错误消息的任何文档,也无法在后台重新启动输入音频队列。

【问题讨论】:

    标签: objective-c ios cocoa audioqueueservices avaudiosession


    【解决方案1】:

    可以,但是要在后台重新激活会话,音频会话必须设置 AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers

    OSStatus propertySetError = 0;
        UInt32 allowMixing = true;
    
    
    
        propertySetError = AudioSessionSetProperty (
                                                    kAudioSessionProperty_OverrideCategoryMixWithOthers,
                                                    sizeof (allowMixing),
                                                    &allowMixing
                                                    );
    

    或者应用必须receive remote control command events:

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
    

    【讨论】:

    • 谢谢!我已经追了好几天了!如果可以的话,我会 +10 :-)
    【解决方案2】:

    目前,如果您在后台,则无法重新激活。

    【讨论】:

      【解决方案3】:

      您是否在 info.plist 中让您的应用支持后台处理?我不确定是否可以在后台录制,但您可能需要添加“必需的背景模式”,然后在“应用程序播放音频”数组中添加一个值

      更新我刚刚查了一下,可以在后台录制。

      【讨论】:

      • 录音在后台运行良好。如果音频会话中断在后台结束,就会出现问题。
      • 您是否尝试过使用远程控制事件?显然,用户将不得不点击按钮。 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
      • 我面临同样的问题:当应用程序处于后台时录制被中断时,应用程序中的任何时候都不会触发“结束中断”通知。由于 iTalk 应用程序正确管理这种中断,应该有一个解决方案......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多