【问题标题】:AVCaptureSession and Preview Layer does not fill entire screenAVCaptureSession 和预览层没有填满整个屏幕
【发布时间】:2017-02-20 15:21:03
【问题描述】:

所以,我尝试在我的应用程序中使用手机上的相机,并且成功了,但不幸的是,在使用预览时,图层并没有填满整个屏幕Here is an image to show you what it looks like

这是我的代码:

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
  • 抱歉,这没用。还有什么我可以做的吗?
  • 你在哪里调用这段代码?
  • 在我的视图控制器中

标签: ios swift3 avfoundation avcapturesession


【解决方案1】:

这可能是因为您试图从具有自动布局约束的视图中设置预览层的框架。尝试将 viewDidLayoutSubviews 方法的覆盖添加到您的视图控制器:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.previewLayer.frame = self.view.layer.bounds
}

【讨论】:

  • 谢谢@ninjaproper,上面的代码解决了我的问题。
【解决方案2】:

请尝试以下方法:

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)
    }

【讨论】:

    【解决方案3】:

    试试下面的代码:

     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);
    
                    }
    

    苹果文档:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多