从后台返回后的 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 返回不同的值