【问题标题】:Properly dismissing a view controller with an AVCaptureSession and AVCaptureVideoPreviewLayer (Programmatically)使用 AVCaptureSession 和 AVCaptureVideoPreviewLayer 正确关闭视图控制器(以编程方式)
【发布时间】:2020-02-03 05:54:47
【问题描述】:

当点击相机按钮时,我将展示一个新的视图控制器 (cameraVC)。 cameraVC 有一个 AVCaptureSession,它可以拍摄照片和视频,并使用麦克风并将其全部显示在 AVCacptureVideoPreviewLayer 上。所有这些都很好。但是当我使用dismiss() 函数关闭cameraVC 时,我不确定如何正确清理其余部分,以便cameraVC 及其组件完全解除分配/释放。当我再次点击相机按钮时,相同的捕获会话仍在运行。事实上,如果我在按下关闭按钮之前开始录制视频,即使 cameraVC 不再显示,相机也会继续录制。我想在点击关闭按钮时完全关闭 cameraVC,包括停止和取消分配该捕获会话和预览层。

在调用dismiss()、session.stopRunning() 和self.previewLayer.removeFromSuperLayer() 之前,我已经尝试过了。从某种意义上说,他们这样做是有效的,但实际的 cameraVC 并没有取消分配,所以当我再次点击相机按钮时,从 viewDidLoad() 中调用的用于实例化会话和预览层的函数不再被调用。我意识到我可以在 viewWillAppear() 中调用这些相同的函数,但是一旦第一次点击相机按钮,不让这些东西在后台持续运行不是更好的做法吗?或者是否建议在调用后仅在后台进行暂停的摄像头会话?

更多:当我在cameraVC 上调用dismiss() 时,viewWillDisappear() 被调用,尽管deinit() 不是。有人可以帮助解释如何进行这项工作,和/或这背后的机制是什么?非常感谢。

【问题讨论】:

    标签: ios swift avcapturesession dismiss


    【解决方案1】:

    我做了三件事,deinit 总是被调用。

    在我的演示者中,我有一个类级别的 cameraVC,所以我在 viewWillAppear 中将它设置为 nil。

    在 CameraVC 中,我使用 CMMotionManager 并在其上调用 stopAccelerometerUpdates。

    要停止 AVCaptureSession,我调用以下方法:

    func stopCaptureSession() {
      captureSession.stopRunning()
    
      if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] {
        for input in inputs {
          captureSession.removeInput(input)
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多