从背景返回后的AVCapturesession处理

时间:2014-03-20 10:04:53

标签: ios iphone avcapturesession

我正在使用AVCaptureSession实现VideoRecorder。 我在viewWillAppear上启动AVCaptureSession并在viewWillDisappear上根据此问题的推荐将其删除AVCaptureSession fails when returning from background 。 现在,当视频正在录制并且应用程序进入后台时,我想停止录制并暂停捕获会话。但是每次应用程序到达前台时,我都会得到以下其中一个

  1. 暂停捕获会话但录制和预览层不断更新
  2. 捕获会话提供带有黑屏的预览图层,此时应用程序可能会崩溃,也可能不会崩溃。
  3. 此时有关处理AVCaptureSession的任何建议。我想只显示录制停止后记录在previewLayer上的最后一帧。

2 个答案:

答案 0 :(得分:3)

这已经很晚了,但我遇到了一些相同的问题。为了解决这个问题,首先必须实现ViewWillAppear和ViewWillDisappear严格用于从一个View Controller到另一个View控制器的应用程序转换。他们不为后台工作,也不为后台工作。我在上面使用了类似的修复:

//application became active
[[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(applicationEnteredForeground:)
name:UIApplicationWillEnterForegroundNotification
                                           object:nil];

//application went into background
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationBecameActive:)
name:UIApplicationDidBecomeActiveNotification
                                           object:nil];

在选择器方法中,只需停止并启动相机会话,并且正如另一个stackoverflow帖子所示,最好懒洋洋地实例化你的avcapturesession,以便你的应用程序是内存保守的

答案 1 :(得分:2)

我遇到了类似的情况,根据我的经验,我发现viewWillDisappear:没有被调用。我真的不确定原因,但是当应用程序处于非活动状态时,我通过订阅通知解决了这个问题。这是一个例子:

在viewWillAppear中:

// Detect this for ending recording
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appInactive:) name:UIApplicationWillResignActiveNotification object:[UIApplication sharedApplication]];

适当的回调方法:

- (void)appInactive:(NSNotification *)notification {
NSLog(@"App going inactive, stopping recording...");
taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{
    [[UIApplication sharedApplication] endBackgroundTask:taskId];
    taskId = UIBackgroundTaskInvalid;
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    question.prepTimeRemaining = [prepEndTime timeIntervalSinceNow];

    // Stop camera stuff
    if (recording)
        [self stopRecording]; // Method to handle shutting down the session, any other cleanup, etc.

    // End task
    [[UIApplication sharedApplication] endBackgroundTask:taskId];
    taskId = UIBackgroundTaskInvalid;
});
}

在viewWillDisappear中:

[[NSNotificationCenter defaultCenter] removeObserver:self];

当我检测到这个时,我立即移动到下一个视图,因此我不确定它在预览图层上留下了什么,但我怀疑它会做你想要的。希望这有帮助!