【问题标题】:AVCaptureSession Pausing SessionAVCaptureSession 暂停会话
【发布时间】:2021-03-15 22:08:12
【问题描述】:

当我想暂停会话时,这是我唯一的解决方案:

func pauseSession () {
            self.sessionQueue.async {
                if self.session.isRunning {
                     self.session.stopRunning()
                }
            }
    }

func resumeSession () {
            self.sessionQueue.async {
                if !self.session.isRunning {
                    self.session.startRunning()
                }
            }
}

这似乎完全停止了会话,这很好,但看起来很昂贵。

我似乎遇到的问题是,如果暂停和恢复被及时调用,整个应用程序会冻结大约 10 秒,直到恢复响应。这主要是因为它还没有完成最后一个过程(是停止还是启动)。

有解决办法吗?

本机相机应用似乎可以很好地做到这一点。如果你打开它,打开最后一张照片,你会看到右上角的绿色指示灯熄灭,表示会话已暂停/停止。如果您在照片上向下滑动,会话将继续。如果您滑动并让它被取消,再次快速滑动您可以看到会话一次又一次地快速暂停和恢复,没有任何问题。

【问题讨论】:

  • 您是否检查过它在没有附加调试器的情况下在发布版本中的行为?

标签: ios swift xcode avfoundation avcapturesession


【解决方案1】:

您可能需要将async 更改为sync

self.sessionQueue.sync {

【讨论】:

  • 不会阻塞主队列。
  • 它将序列化sessionQueue对主队列没有影响
  • 它实际上在启动和停止时会冻结 UI 几秒钟。
  • developer.apple.com/documentation/avfoundation/avcapturesession 提到: startRunning() 方法是一个阻塞调用,可能需要一些时间,因此您应该在串行队列上执行会话设置,这样主队列就不会被阻塞(这会保持UI 响应式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2017-10-17
相关资源
最近更新 更多