我正在使用AVCaptureSession实现VideoRecorder。 我在viewWillAppear上启动AVCaptureSession并在viewWillDisappear上根据此问题的推荐将其删除AVCaptureSession fails when returning from background 。 现在,当视频正在录制并且应用程序进入后台时,我想停止录制并暂停捕获会话。但是每次应用程序到达前台时,我都会得到以下其中一个
此时有关处理AVCaptureSession的任何建议。我想只显示录制停止后记录在previewLayer上的最后一帧。
答案 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];
当我检测到这个时,我立即移动到下一个视图,因此我不确定它在预览图层上留下了什么,但我怀疑它会做你想要的。希望这有帮助!