iOS开发-识别条形码并且同时进行拍照方案
识别条形码\二维码
-
创建Session
let captureSession = AVCaptureSession()
-
获取Device
let captureDevice = AVCaptureDevice.default(for: .video)
-
创建DeviceInput
let deviceInput = AVCaptureDeviceInput(device: captureDevice) captureSession.addInput(deviceInput)
-
创建CaputreOutput
let metaOutput = AVCaptureMetadataOutput.init() metaOutput.setMetadataObjectsDelegate(self, queue: captureQueue) metaOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.code128] captureSession.addOutput(metaOutput)
-
实现代理方法
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)
}
两种方案对比
方案一,因为是可以配置拍照的参数,所以在呈像方面,会比较稳定。但是会有快门声
方案二,因为直接获取的是视频流,所以防抖方面没那么好,但是在连续获取视频帧的时候,会比拍照快很多,或者说方案一不适合这种连续获取视频帧的场景
注意点
- AVCapturePhotoSettings 需要每次都创建对象,只能用一次,否则会crash
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbafhh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13