我看过许多类似的问题,也尝试过许多解决方案,但这个案例有点不同。我正在使用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,所以我认为这可能是部分原因,我使用的样本缓冲区委托,但不能完全拼凑如何/为什么。任何帮助都是感激的。谢谢!2谢谢!
1条答案
按热度按时间8oomwypt1#
使用开始配置和提交配置
`
字符串
//结束
型
`
这对我很有效