Front Camera to Fill Circular UIView

后端 未结 1 1289
被撕碎了的回忆
被撕碎了的回忆 2021-01-21 10:16

In an app I\'m developing the user is required to take a \"selfie\" (Yes, I know, but the app is for private use only).

I\'ve got everything working with the camera show

相关标签:
1条回答
  • 2021-01-21 11:03

    As it turns out, the camera's "self.previewLayer" has a property that determines how the camera's content fills a View.

    In the following code I changed "self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspect" to "self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill"

    extension SelfieViewController:  AVCaptureVideoDataOutputSampleBufferDelegate{
        func setupAVCapture(){
            session.sessionPreset = AVCaptureSessionPreset640x480
    
            let devices = AVCaptureDevice.devices();
            // Loop through all the capture devices on this phone
            for device in devices {
                // Make sure this particular device supports video
                if (device.hasMediaType(AVMediaTypeVideo)) {
                    // Finally check the position and confirm we've got the front camera
                    if(device.position == AVCaptureDevicePosition.Front) {
                        captureDevice = device as? AVCaptureDevice
                        if captureDevice != nil {
                            beginSession()
                            break
                        }
                    }
                }
            }
        }
    
        func beginSession(){
            var err : NSError? = nil
            var deviceInput:AVCaptureDeviceInput = AVCaptureDeviceInput(device: captureDevice, error: &err)
            if err != nil {
                println("error: \(err?.localizedDescription)")
            }
            if self.session.canAddInput(deviceInput){
                self.session.addInput(deviceInput)
            }
    
            self.videoDataOutput = AVCaptureVideoDataOutput()
            var rgbOutputSettings = [NSNumber(integer: kCMPixelFormat_32BGRA):kCVPixelBufferPixelFormatTypeKey]
            self.videoDataOutput.alwaysDiscardsLateVideoFrames=true
            self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL)
            self.videoDataOutput.setSampleBufferDelegate(self, queue:self.videoDataOutputQueue)
            if session.canAddOutput(self.videoDataOutput){
                session.addOutput(self.videoDataOutput)
            }
            self.videoDataOutput.connectionWithMediaType(AVMediaTypeVideo).enabled = true
    
            self.previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
            self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    
            var rootLayer :CALayer = self.cameraView.layer
            rootLayer.masksToBounds=true
            self.previewLayer.frame = rootLayer.bounds
            rootLayer.addSublayer(self.previewLayer)
            session.startRunning()
    
        }
    
        func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
            // do stuff here
        }
    
        // clean up AVCapture
        func stopCamera(){
            session.stopRunning()
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题