我正在编写一个应用程序,该应用程序在用户按下按钮后每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的射速方面存在问题。

09-29 23:06