AVFoundation videoZoomFactor无法正常工作(Swift)

时间:2017-11-10 19:56:55

标签: ios swift avfoundation

除了zoomfactor之外,我想要使用的所有相机调整都在工作。我迷失了为什么会发生这种情况......任何想法?自定义曝​​光和对焦设置工作正常。在iOS中有什么变化我不知道吗?

captureSession = AVCaptureSession()
    captureSession?.sessionPreset = AVCaptureSessionPresetPhoto
    stillImageOutput = AVCapturePhotoOutput()

    let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

    do{
        do{
            try device?.lockForConfiguration()
            device?.setFocusModeLockedWithLensPosition(focusValue, completionHandler: {(time) -> Void in})
            device?.setExposureModeCustomWithDuration(CMTimeMake(1, exposureValue), iso: ISOValue, completionHandler: {(time) -> Void in})
            let zoomFactor:CGFloat = 16
            device?.videoZoomFactor = zoomFactor
            device?.unlockForConfiguration()

        }catch{
            print(error)
        }

        stillImageOutput.isHighResolutionCaptureEnabled = true
        let input = try AVCaptureDeviceInput(device: device)
        if(captureSession.canAddInput(input)){
            captureSession.addInput(input)
            if(captureSession.canAddOutput(stillImageOutput)){
                captureSession.addOutput(stillImageOutput)

                captureSession.startRunning()
                let captureVideoLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: captureSession)
                captureVideoLayer.frame = self.previewView.bounds
                captureVideoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                self.previewView.layer.insertSublayer(captureVideoLayer, at: 0)
            }
        }
    }catch{
        print(error)
    }

2 个答案:

答案 0 :(得分:1)

结果我只是将我的设备设置设置在错误的位置。如果lockconfig try块移动到捕获会话之下,那么它将按预期工作。

答案 1 :(得分:0)

我使用Apple的照片和视频采集示例代码(即AVFoundation),尝试更改代码中iPhone相机的设备缩放。

user2345335的帮助下,我意识到放置缩放操作属性的代码位置很重要-此外,请确保在任何videoDevice操作之前使用device.lockForConfiguration()!两者都很重要(代码位置和锁定!)。

这里的链接和屏幕截图显示了可从中获取原始Apple示例的下载按钮:

AVFoundation Apple Code example: Link

enter image description here

这是原始Apple示例的代码摘录,其中带有在正确位置插入放大的“我的代码”:)

(Swift-4.2 / Xcode 10.0,iOS 11.0 SDK)

// Call this on the session queue.
private func configureSession() {
    if setupResult != .success {
        return
    }

    // ... missing original code (not important for this illustration)...

    // Add video input.
    do {
        var defaultVideoDevice: AVCaptureDevice?

        // ... missing original code (not important for this illustration)...

        if session.canAddInput(videoDeviceInput) {
            session.addInput(videoDeviceInput)
            self.videoDeviceInput = videoDeviceInput

            // ... missing original code (not important for this illustration)...

        } else {
            print("Could not add video device input to the session")
            setupResult = .configurationFailed
            session.commitConfiguration()
            return
        }

        // !!!!!!!!!!!!!!!! MY CODE THAT MANIPULATES THE ZOOM  !!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // !!!!!!!!!!!!!!!! PLACE IT HERE AND ZOOM WILL WORK !!!!!!!!!!!!!!!!!!!!!!!!!!!!
        guard let device = defaultVideoDevice else { return }
        do {
            try device.lockForConfiguration()
            defer { device.unlockForConfiguration() }
            device.videoZoomFactor = 10.0
        } catch {
            debugPrint(error)
        }
        // !!!!!!!!!!!!!! END OF MY CODE THAT MANIPULATES THE ZOOM  !!!!!!!!!!!!!!!!!!!!!!!!!!

    } catch {
        print("Could not create video device input: \(error)")
        setupResult = .configurationFailed
        session.commitConfiguration()
        return
    }

    // Add audio input.
    do {
        let audioDevice = AVCaptureDevice.default(for: .audio)
        let audioDeviceInput = try AVCaptureDeviceInput(device: audioDevice!)

        if session.canAddInput(audioDeviceInput) {
            session.addInput(audioDeviceInput)
        } else {
            print("Could not add audio device input to the session")
        }
    } catch {
        print("Could not create audio device input: \(error)")
    }

    // Add photo output.
    if session.canAddOutput(photoOutput) {
        session.addOutput(photoOutput)

        photoOutput.isHighResolutionCaptureEnabled = true
        photoOutput.isLivePhotoCaptureEnabled = photoOutput.isLivePhotoCaptureSupported
        photoOutput.isDepthDataDeliveryEnabled = photoOutput.isDepthDataDeliverySupported
        livePhotoMode = photoOutput.isLivePhotoCaptureSupported ? .on : .off
        depthDataDeliveryMode = photoOutput.isDepthDataDeliverySupported ? .on : .off

    } else {
        print("Could not add photo output to the session")
        setupResult = .configurationFailed
        session.commitConfiguration()
        return
    }

    session.commitConfiguration()
}