• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

iOS开发-识别条形码并且同时进行拍照方案

武飞扬头像
啊哈Man
帮助2

识别条形码\二维码

  1. 创建Session

     let captureSession = AVCaptureSession()
    
  2. 获取Device

     let captureDevice = AVCaptureDevice.default(for: .video)
    
  3. 创建DeviceInput

     let deviceInput = AVCaptureDeviceInput(device: captureDevice)
     captureSession.addInput(deviceInput)
    
  4. 创建CaputreOutput

    let metaOutput = AVCaptureMetadataOutput.init() 
    metaOutput.setMetadataObjectsDelegate(self, queue: captureQueue)
    metaOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.code128]
    captureSession.addOutput(metaOutput)
    
  5. 实现代理方法

    func metadataOutput(_ output: AVCaptureMetadataOutput,
         didOutput metadataObjects: [AVMetadataObject],
         from connection: AVCaptureConnection) {
         // 这里处理识别结果逻辑
    }
    

识别条形码\二维码并拍照

方案一 AVCapturePhotoOutput

let photoOutput = AVCapturePhotoOutput()
captureSession.addOutput(photoOutput)

在识别到运单号\二维码结果的回调中,调用拍照方法

func metadataOutput(_ output: AVCaptureMetadataOutput,
        didOutput metadataObjects: [AVMetadataObject],
        from connection: AVCaptureConnection) {
        
        // 这里处理识别结果逻辑
        
        let setting = {
            let setting = AVCapturePhotoSettings()
            // 启用自动静止图像稳定功能
            setting.photoQualityPrioritization = .balanced
            return setting
        }()
        
        photoOutput?.capturePhoto(with: setting, delegate: self)
}

/// 拍照回调
func photoOutput(_ output: AVCapturePhotoOutput,
                   didFinishProcessingPhoto photo: AVCapturePhoto,
                   error: Error?) {
                   
         guard let imageData = photo.fileDataRepresentation(), 
               let image = UIImage(data: imageData) else {
             // 获取到图片
         }
 }

方案二 AVCaptureVideoDataOutput

let videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.setSampleBufferDelegate(self, queue: captureQueue)

条形码识别视频流获取代理方法设置在同一个串行队列中回调

这样只需要在获取到识别结果后,通过标记位标记,需要保存当前视频流的帧即可

func metadataOutput(_ output: AVCaptureMetadataOutput,
        didOutput metadataObjects: [AVMetadataObject],
        from connection: AVCaptureConnection) {
        
        // 这里处理识别结果逻辑
        
        // 设置标记位
        captureFlag = true
}

/// 实现视频流回调方法
func captureOutput(_ output: AVCaptureOutput,
                    didOutput sampleBuffer: CMSampleBuffer,
                    from connection: AVCaptureConnection) {
    // flag 
    guard captureFlag else { return }
    
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { 
        return 
    }
    let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
    let image = UIImage(ciImage: ciImage)
}

两种方案对比

方案一,因为是可以配置拍照的参数,所以在呈像方面,会比较稳定。但是会有快门声

方案二,因为直接获取的是视频流,所以防抖方面没那么好,但是在连续获取视频帧的时候,会比拍照快很多,或者说方案一不适合这种连续获取视频帧的场景

注意点

  1. AVCapturePhotoSettings 需要每次都创建对象,只能用一次,否则会crash

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbafhh
系列文章
更多 icon
同类精品
更多 icon
继续加载