【问题标题】:AVCaptureVideoPreviewLayer, wrong orientationAVCaptureVideoPreviewLayer,方向错误
【发布时间】:2021-04-01 14:20:36
【问题描述】:

我正在尝试根据设备的方向旋转 AVCaptureVideoPreviewLayer。

  1. 在纵向模式下,它工作正常。

  2. 但是,在风景中,它看起来像这样:

  3. 我尝试过围绕 AVCaptureVideoPreviewLayer 旋转 UIView,但我不想采用这种方法,因为它会裁剪边缘。

  4. 我也尝试过手动设置。但是,打开时连接似乎为零,并且 AVCaptureVideoOrientation 的方向没有变化。

    camera.preview.connection?.videoOrientation = AVCaptureVideoOrientation.landscapeRight

如何确保 AVCaptureVideoPreviewLayer 与设备的方向一致?

代码如下:

class CameraModel: NSObject, ObservableObject, AVCapturePhotoCaptureDelegate {
    
    @Published var session = AVCaptureSession()
    
    // since were going to read pic data...
    @Published var output = AVCapturePhotoOutput()
    
    // preview
    @Published var preview : AVCaptureVideoPreviewLayer!
    
    func setUp() {
        
        // setting up camera...
        
        do {
            
            // setting configs...
            self.session.beginConfiguration()
            
            // change for your own
            
            let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)
            
            let input = try AVCaptureDeviceInput(device: device!)
            
            // checking and adding to session...
            
            if self.session.canAddInput(input) {
                self.session.addInput(input)
            }
            
            // same for output...
            
            if self.session.canAddOutput(self.output) {
                self.session.addOutput(self.output)
            }
            
            self.session.commitConfiguration()
        }
        catch {
            print(error.localizedDescription)
        }
    }
    
}

struct CameraPreview: UIViewRepresentable {
    
    @ObservedObject var camera: CameraModel
    
    func makeUIView(context: Context) -> UIView {
        
        let view = UIView(frame: UIScreen.main.bounds)
        
        camera.preview = AVCaptureVideoPreviewLayer(session: camera.session)
        camera.preview.frame = view.frame

        // Your Own Properties
        camera.preview.videoGravity = .resizeAspectFill
        view.layer.addSublayer(camera.preview)
        
        // starting session
        camera.session.startRunning()
        
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {
        
    }
    
}

【问题讨论】:

  • 我现在也遇到同样的问题,你找到解决办法了吗?

标签: ios swift swiftui avcapturesession


【解决方案1】:

在 UpdateUIView 中更新为横向模式 -

    func updateUIView(_ uiView: UIViewType, context: Context) {
        camera.preview.connection?.videoOrientation = .landscapeRight
    }

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多