AVCaptureSession 和 Preview Layer 不能填满整个屏幕

5

所以,我在我的应用程序中尝试使用手机相机,我成功了,但不幸的是,在使用预览时,图层没有填满整个屏幕。这里是一张图片展示了它的样子

这是我的代码:

if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
        self.previewLayer = previewLayer
        self.view.layer.addSublayer(self.previewLayer)
        self.previewLayer.frame = self.view.layer.frame
        captureSession.startRunning()

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)]

        dataOutput.alwaysDiscardsLateVideoFrames = true

        if captureSession.canAddOutput(dataOutput) {
            captureSession.addOutput(dataOutput)
        }

        captureSession.commitConfiguration()


        let queue = DispatchQueue(label: "com.Osmo.captureQueue")
        dataOutput.setSampleBufferDelegate(self, queue: queue)
    }

尝试设置 self.view.layer.bounds 而不是其他属性。 - Pablo A.
抱歉,那个没起作用。我还能帮你做些什么吗? - Arya K
你在哪里调用这段代码? - Pablo A.
在我的ViewController中 - Arya K
3个回答

7
这可能是由于您正在尝试从具有自动布局约束的视图设置预览层的框架。请尝试向您的视图控制器添加viewDidLayoutSubviews方法的覆盖:
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.previewLayer.frame = self.view.layer.bounds
}

1
谢谢@ninjaproper,上面的代码解决了我的问题。 - Kavitha Madhu

3
请尝试以下方法:
if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
        self.previewLayer = previewLayer
        self.previewLayer.frame = self.view.bounds
        self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        self.view.layer.insertSublayer(self.previewLayer, at: 0)
        captureSession.startRunning()

        let dataOutput = AVCaptureVideoDataOutput()
        dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)]

        dataOutput.alwaysDiscardsLateVideoFrames = true

        if captureSession.canAddOutput(dataOutput) {
            captureSession.addOutput(dataOutput)
        }

        captureSession.commitConfiguration()


        let queue = DispatchQueue(label: "com.Osmo.captureQueue")
        dataOutput.setSampleBufferDelegate(self, queue: queue)
    }

0
尝试以下代码片段:
 if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
                    previewLayer.bounds = view.bounds
                    previewLayer.position = CGPoint(x: view.bounds.midX, y: view.bounds.midY)   //CGPointMake(view.bounds.midX, view.bounds.midY)
                    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                    let cameraPreview = UIView(frame: CGRect(x: 0.0, y: 0.0, width: view.bounds.width, height: view.bounds.height));
                    cameraPreview.tag = 44221007
                    cameraPreview.layer.addSublayer(previewLayer)
                    //cameraPreview.addGestureRecognizer(UITapGestureRecognizer(target: self, action:Selector(("saveToCamera:"))))
                    view.addSubview(cameraPreview)
                    self.view.sendSubview(toBack: cameraPreview);

                }

苹果文档: AVFoundation class image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接