簡體   English   中英

如何在iOS11中將AVCaptureVideoPreviewLayer旋轉90度以進行更正?

[英]How to rotate a AVCaptureVideoPreviewLayer by 90 degrees to correct it in iOS11?

我有一個AVCaptureVideoPreviewLayer ,將其設置為使用前置攝像頭Feed捕獲會話的實時預覽。 但是,輸出旋轉了90度,我正在嘗試使該圖層與我的應用程序的其余部分對齊,即“ Landscape 是否可以將其旋轉90 degrees以進行校正?

到目前為止,這是我的代碼:

override func viewDidLoad() {
    super.viewDidLoad()

    let captureSession = AVCaptureSession()

    guard let captureDevice = getDevice(position: .front) else { return }
    guard let input = try? AVCaptureDeviceInput(device: captureDevice) else { return }
    captureSession.addInput(input)

    captureSession.startRunning()

    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    view.layer.addSublayer(previewLayer)
    previewLayer.frame = view.frame
    previewLayer.videoGravity = .resizeAspectFill
    previewLayer.connection?.automaticallyAdjustsVideoMirroring = false
    previewLayer.connection?.isVideoMirrored = false
}

func getDevice(position: AVCaptureDevice.Position) -> AVCaptureDevice? {
    let devices = AVCaptureDevice.devices() as NSArray;
    for de in devices {
        let deviceConverted = de as! AVCaptureDevice
        if(deviceConverted.position == position){
            return deviceConverted
        }
    }
    return nil
}

您是否可以將previewLayer添加到另一個UIView ,並嘗試像這樣旋轉:

private var captureView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.captureView = UIView(frame: self.view.bounds)
    self.captureView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.view.addSubview(captureView)

    // ...
    captureView.layer.addSublayer(previewLayer)
    // ...

    self.rotateView(animated: false)
}

// Rotating captureView based on device orientation
func rotateView(animated: Bool) {
    var transform: CGAffineTransform?
    switch UIDevice.current.orientation {
    case .portraitUpsideDown:
        transform = CGAffineTransform(rotationAngle: CGFloat.pi)
    case .landscapeLeft:
        transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2)
    case .landscapeRight:
        transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2)
    default:
        break
    }

    guard animated else {
        self.captureView.transform(transform)
        return
    }

    UIView.animate(withDuration: 0.5, animations: {[weak self] in
        self?.captureView.transform(transform)
    })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM