微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AVCapturePhotoOutput capturePhoto - 与预览相比,结果偏移/向下跳

如何解决AVCapturePhotoOutput capturePhoto - 与预览相比,结果偏移/向下跳

我正在使用 AVCapturePhotoOutput相机拍照。但是,与预览视频源相比,拍摄的照片有时(约 50% 的时间)会略微向下偏移。

以下是我设置视频源的方法

let avSession = AVCaptureSession()
let photoOutput = AVCapturePhotoOutput()

override func viewDidLoad() {
    super.viewDidLoad()
    
    let cameraDevice = AVCaptureDevice.default(.builtInWideAngleCamera,for: .video,position: .back)!
    
    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: cameraDevice)
        if avSession.canAddInput(captureDeviceInput) {
            avSession.addInput(captureDeviceInput)
            avSession.sessionPreset = .photo
        }
        if avSession.canAddOutput(photoOutput) {
            avSession.addOutput(photoOutput)
        }
    } catch {
        print("Error: \(error)")
    }
    
    previewView.videoPreviewLayer.frame = view.layer.bounds
    previewView.videoPreviewLayer.videoGravity = .resizeAspectFill
    previewView.session = self.avSession
    
    avSession.startRunning() /// start the session
    outputimageView.alpha = 0 /// hide image view
}

这会按预期生成实时视频预览。接下来,我使用 capturePhoto(with:delegate:) 拍照:

let photoSettings = AVCapturePhotoSettings()
if let photoPreviewType = photoSettings.availablePreviewPhotoPixelFormatTypes.first {
    photoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: photoPreviewType]
    photoOutput.capturePhoto(with: photoSettings,delegate: self)
}
/// get the image from `capturePhoto`
extension ViewController: AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput,didFinishProcessingPhoto photo: AVCapturePhoto,error: Error?) {
        if let imageData = photo.fileDataRepresentation() {
            let previewImage = UIImage(data: imageData)
            outputimageView.image = previewImage
            outputimageView.alpha = 1
        }
    }
}

结果 (video version here):

Image jumps down when Capture button pressed

我怎样才能摆脱这种偏移?我希望来自 capturePhoto 的照片尽可能与视频提要相符。我还看到了 this question,这似乎是一个类似的问题,但它已经超过 6 年了,解决方案不起作用。

Full demo project of the problem

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。