[iOS Swift3.0/Oc] 摄像头实时获取视频流效果 简单记录

Oc参考贴: iOS从摄像头获得实时视频流

ios-深度解析二维码的生成与使用

Swift 3.0

1.创建 会话对象+输入对象+输出对象

为了能实时看到摄像机获取的视频图像,还要创建一个 预览图层(AVCaptureVideoPreviewLayer), 不然即使获取了摄像头对象,你也看不到拍摄的图

    //会话对象 (负责输入和输出设置之间的数据传递)
    private lazy var  session : AVCaptureSession = AVCaptureSession()

    //输入设备 (摄像头)
    private lazy var deviceInput : AVCaptureInput? = {
        //获取摄像头 (默认设置后置摄像头)
        let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
        do {
            //创建输入对象
            let input = try AVCaptureDeviceInput.init(device: device)
            return input
        }catch{
            print(error)
            return nil
        }
    }()
    //输入对象
    private lazy var deviceOutPut : AVCaptureMetadataOutput = AVCaptureMetadataOutput()
    //创建预览图层
    private lazy var previewLayer : AVCaptureVideoPreviewLayer = {
        let layer = AVCaptureVideoPreviewLayer.init(session: self.session) // 闭包要访问外界数据  要self
        layer?.frame = UIScreen.main.bounds
        return layer!
    }()

2. 将输入对象/输出对象 添加到session(会话)中

    private func startScan(){
         //1.判断能否将输入添加到会话中
        if !session.canAddInput(deviceInput) {
            return
        }
        //2.判断能否将输出添加到会话中
        if !session.canAddOutput(deviceOutPut) {
            return
        }
        //3.添加到会话中
        session.addInput(deviceInput)
        session.addOutput(deviceOutPut)
        //4.设置输出能够解析的数据类型 (一定要在输出对象添加到会话之后才能设置,否则Bug)
        deviceOutPut.metadataObjectTypes = deviceOutPut.availableMetadataObjectTypes  //设置系统所有的数据类型都能解析
        //5.设置输出对象的代理 (只要解析成功就会通知代理)
        deviceOutPut.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        //添加预览图层到底层
        view.layer.insertSublayer(previewLayer, at: 0)
        //6.告诉session会话,开始扫描
        session.startRunning()
    }

3. AVCaptureMetadataOutputObjectsDelegate 代理中处理数据

extension QRcodeViewController:AVCaptureMetadataOutputObjectsDelegate{

    //只要解析到数据,就会调用
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
        guard let objc = metadataObjects.last as? AVMetadataMachineReadableCodeObject
            else {
                return
        }
        print(objc.stringValue)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值