我正在编写一个应用程序,该应用程序在用户按下按钮后每0.1秒拍摄一次图像。但是,我很难在图像之间获得一致的0.1秒延迟。
这是由于captureStillImageAsynchronously
是异步关闭的事实吗?从capturePhoto
切换到AVCapturePhotoOutput
是否可以解决此问题?这是我的代码摘要。
var stillImageOutput : AVCaptureStillImageOutput?
// Button action.
@IBAction func takeImage(_ sender: UIButton) {
//take 1 image every 0.1 seconds scheduled using a timer
Timer.scheduledTimer(timeInterval: 0.1,
target: self,
selector: #selector(calldidPressTakePhoto),
userInfo: nil,
repeats: true)
}
// Take image
func didPressTakePhoto(){
if let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo){
videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait
//Capture image. everything in this closure is ASYNCHRONOUS?
stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: {
(sampleBuffer, error) in
//Do something with the result image...
})
}
}
最佳答案
我最好的选择是,虽然.captureStillImageAsynchronously是异步的,但它仍然访问共享资源,因此很可能会有一个内部互斥体,阻止您如此快地调用它,以致于它在执行中会重叠。我认为您的相机在保持0.1s的射速方面存在问题。