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

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

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

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

【问题讨论】:

    标签: ios iphone avcapturesession


    【解决方案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];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 2014-08-28
      • 1970-01-01
      相关资源
      最近更新 更多