AVCaptureSession和预览图层不会填充整个屏幕

问题描述:

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

这里是我的代码:

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

尝试设置'self.view.layer.bounds'代替 –

+0

对不起,没有工作。还有什么我可以做的吗? –

+0

你在哪里调用这段代码? –

请尝试以下方法:

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

试试下面的代码:

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

这可能发生,因为你想从视图具有自动布局限制设置预览层的框架。尝试viewDidLayoutSubviews方法的重写添加到您的视图控制器:

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