iOS_Swift_自定义相机

1、import所需要的框架

import UIKit

import AVFoundation

2、初始化会话及拍照图层

/// 初始化照相图层

    ///

    /// - Returns: 返回初始化结果

    func initCamera() -> Bool {

 

        // 创建会话

        captureSession = AVCaptureSession()

        captureSession.beginConfiguration()

       

        // 照片图层

        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

        previewLayer.frame = self.bounds

        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspect

        self.layer.addSublayer(previewLayer)

       

        // 设定输出流

        output = AVCaptureVideoDataOutput()

        if captureSession.canAddOutput(output) {

            captureSession.addOutput(output)

            let queue = DispatchQueue(label: "dispatchQueue_label_1")  // label给queue设定一个标识

            output.setSampleBufferDelegate(self, queue: queue)

            captureSession.commitConfiguration()

            return true

        }

        return false

    }

 

 

3、开始照相

/// 开始照相

    ///

    /// - Parameter position: 前置/后置

    /// - Returns: 成功返回nil 否则返回一个error

    func beginTakePhoto(position: AVCaptureDevice.Position) -> Error? {

        

        self.stopToTakePhoto = false

        

        captureSession.stopRunning()

        

        // 摄像头设备

        let availbleDevices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: position).devices

        device = availbleDevices.first

        

        do {

            

            for input in captureSession.inputs {

                captureSession.removeInput(input)

            }

            let captureDeviceInput = try AVCaptureDeviceInput(device: device)

            captureSession.addInput(captureDeviceInput)

        } catch {

            return error

        }

        

        captureSession.startRunning()

        

        return nil

    }

    

 

4、停止照相

/// 停止照相

    ///

    /// - Parameter complete: 回调

    func stopTakePhoto (complete:@escaping (UIImage?) -> ())  {

        self.getImgComplete = complete

 // 开始照相之后每刷新一帧都会在代理中回调,使用一个变量来判断是否获取当前帧图片

        self.stopToTakePhoto = true

        self.captureSession.stopRunning()

    }

 

 

5、照相回调,获取照片

 

首先要遵守代理 AVCaptureVideoDataOutputSampleBufferDelegate

// 代理方法

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {

 

        // 根据全局定义的一个变量来判断是否获取照片

        if self.stopToTakePhoto {

 

            DispatchQueue.main.async {

                let image = self.imageConvert(sampleBuffer: sampleBuffer)

                self.getImgComplete!(image) // 用闭包 回传获取的图片

            }

 

        }

    }

 

    // 从CMSampleBuffer中获取图片

    private  func imageConvert(sampleBuffer:CMSampleBuffer?) -> UIImage? {

        guard sampleBuffer != nil && CMSampleBufferIsValid(sampleBuffer!) == true else { return nil }

        let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer!)

        let ciImage = CIImage(cvPixelBuffer: pixelBuffer!)

        return UIImage(ciImage: ciImage)

    }

 

   // 旋转方向

    private  func getCaptureVideoOrientation() -> AVCaptureVideoOrientation {

        switch UIDevice.current.orientation {

        case .portrait,.faceUp,.faceDown:

            return .portrait

        case .portraitUpsideDown: // 如果这里设置成AVCaptureVideoOrientationPortraitUpsideDown,则视频方向和拍摄时的方向是相反的。

            return .portrait

        case .landscapeLeft:

            return .landscapeRight

        case .landscapeRight:

            return .landscapeLeft

        default:

            return .portrait

        }

    }    

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值