我看过很多其他类似的问题,并尝试了很多解决方案,但这个案例有点不同。我正在使用 AVCaptureVideoDataOutputSampleBufferDelegate,以便我可以将 CIFilters 应用于实时视频源。我正在使用以下方法来更换相机:
func changeCameras() {
captureSession.stopRunning()
var desiredPosition: AVCaptureDevicePosition?
if front {
desiredPosition = AVCaptureDevicePosition.Back
} else {
desiredPosition = AVCaptureDevicePosition.Front
}
let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) as? [AVCaptureDevice]
for device in devices! {
if device.position == desiredPosition {
self.captureSession.beginConfiguration()
do {
let input = try AVCaptureDeviceInput(device: device)
for oldInput in self.captureSession.inputs {
print(oldInput)
self.captureSession.removeInput(oldInput as! AVCaptureInput)
}
print(input)
self.captureSession.addInput(input)
self.captureSession.commitConfiguration()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.captureSession.startRunning()
})
} catch { print("evic failed")}
}
}
front = !front
}
我用来设置相机(在viewDidLoad中调用)并从委托接收sampleBuffer的方法如下:https://gist.github.com/JoeyBodnar/17e22e3c04093caa54cf240ed8b1b601。
一个问题是,当按下按钮更换摄像头时,屏幕需要冻结 4-5 秒才能更换。我已经尝试了上述方法,以及创建一个单独的队列来运行整个函数,但仍然需要很长时间。当仅使用常规 AVVideoPreviewLayer 切换摄像机时,我从未遇到过此问题,所以我认为这可能部分是由于我使用示例缓冲区委托这一事实引起的,但无法完全拼凑出如何/为什么。任何帮助表示赞赏。谢谢!
使用开始配置和提交配置
`
DispatchQueue.global().async {
self.captureSession.beginConfiguration()
//cupture session configurations here
//结束于
self.captureSession.commitConfiguration()
DispatchQueue.main.async {
self.captureSession.startRunning()
}
}
`
这对我有用