从后台返回后的 AVCapturesession 处理

Posted

技术标签:

【中文标题】从后台返回后的 AVCapturesession 处理【英文标题】:AVCapturesession handling after returning from background 【发布时间】:2014-03-20 10:04:52 【问题描述】:

我正在使用 AVCaptureSession 实现 VideoRecorder。 我在 viewWillAppear 开始 AVCaptureSession 并在 viewWillDisappear 建议这个问题AVCaptureSession fails when returning from background . 现在,当视频正在录制并且应用程序进入后台时,我想停止录制并暂停捕获会话。但是每次应用程序在此时出现在前台时,我都会得到以下结果之一

    Capture Session 未暂停,但正在录制且预览层不断更新 Capture Session 为 Preview Layer 提供了黑屏,此时应用可能会或可能不会崩溃。

关于此时处理 AVCaptureSession 的任何建议。一旦录制停止,我只想显示在 previewLayer 上录制的最后一帧。

【问题讨论】:

【参考方案1】:

我遇到过类似的情况,根据我的经验,我发现 viewWillDisappear: 没有被调用。我真的不知道为什么,但我通过在应用程序处于非活动状态时订阅通知来解决它。这是一个例子:

在视图中将出现:

// 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;
);

在视图中将消失:

[[NSNotificationCenter defaultCenter] removeObserver:self];

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

【讨论】:

我在没有显式后台队列实现的情况下做了同样的事情。记录停止并写入文件。问题是当我进入前台时,捕获会话不会保持最后一个冻结帧。对此有什么想法吗? @EdAbe 不太清楚为什么会发生这种情况。您可以尝试添加AVCaptureStillImageOutput 并尝试捕获通知的最后一帧。然后在应用程序恢复时显示该图像而不是预览层。我从来没有使用过它,所以它可能根本不起作用,但值得一试。祝你好运!【参考方案2】:

这已经很晚了,但我也遇到了一些相同的情况。为了解决这个问题,您首先必须意识到 ViewWillAppear 和 ViewWillDisappear 严格用于从一个 View Controller 到另一个 View Controller 的应用程序转换。它们不适用于从前景到背景再返回的过渡。我在上面使用了类似的修复:

//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];

在选择器方法中,只需停止并启动您的相机会话,正如另一个 *** 帖子所建议的那样,懒惰地实例化您的 avcapturesession 是个好主意,这样您的应用程序就可以节省内存

【讨论】:

以上是关于从后台返回后的 AVCapturesession 处理的主要内容,如果未能解决你的问题,请参考以下文章

应用程序从 iPhone 上的后台返回后的 copyNextSampleBuffer

Cordova iOS 应用程序,从后台模式返回后的页面性能问题

CoreML 使用 AVCaptureSession 返回不同的值

播放电影停止 avcapturesession 录制

前置摄像头的 AVCaptureSession canAddInput 在 iPad 上总是返回 false

从 AVCaptureSession 捕获的 iPhone 图像比例