【问题标题】:How to implement 2x zoom from camera app with AVCaptureVideoPreviewLayer如何使用 AVCaptureVideoPreviewLayer 从相机应用程序实现 2 倍缩放
【发布时间】:2017-03-16 20:09:23
【问题描述】:

我的应用中有一个 AVCaptureVideoPreviewLaye,它运行良好,并且显示与相机应用相同的预览视频。我想实现相机应用程序的 2 倍变焦功能。我该怎么做?

基本上,当您点击 1x 图标将其更改为 2x 时,我希望我的预览层将视频源更改为与您在相机应用中看到的相同。

设置预览层

func startSession(){
    captureSession = AVCaptureSession()
    captureSession?.sessionPreset = AVCaptureSessionPresetPhoto
    
    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
    
    // Catch error using the do catch block
    do {
        let input = try AVCaptureDeviceInput(device: backCamera)
        if (captureSession?.canAddInput(input) != nil){
            captureSession?.addInput(input)
            
            // Setup the preview layer
            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
            previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait
            tempImageView.layer.addSublayer(previewLayer!)
            captureSession?.startRunning()
            
            // Set up AVCaptureVideoDataOutput
            let dataOutput = AVCaptureVideoDataOutput()
            dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString) : NSNumber(value: kCVPixelFormatType_32BGRA as UInt32)]
            dataOutput.alwaysDiscardsLateVideoFrames = true
            
            if (captureSession?.canAddOutput(dataOutput) == true) {
                captureSession?.addOutput(dataOutput)
            }
            let queue = DispatchQueue(label: "com.bigbob.videoQueue")
            dataOutput.setSampleBufferDelegate(self, queue: queue)
        }
    } catch _ {
        print("Error setting up camera!")
    }

【问题讨论】:

    标签: ios swift avcapturesession


    【解决方案1】:

    设置AVCaptureDevice.defaultDevicevideoZoomFactor,预览层的缩放将随之而来。注意 Swift 4 现在称为 AVCaptureDevice.default

    do {
        try backCamera?.lockForConfiguration()
        let zoomFactor:CGFloat = 2
        backCamera?.videoZoomFactor = zoomFactor
        backCamera?.unlockForConfiguration()
    } catch {
           //Catch error from lockForConfiguration
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多