使用AVFoundation框架实现扫描二维码

简介: 使用AVFoundation框架实现扫描二维码

iOS 7之前,开发者开发扫描二维码功能时,一般会借助第三方库,常用的如ZBarSDK等。iOS 7之后,苹果官方提供的AVFoundation框架中,提供了解析二维码的接口。经过测试,使用原生API扫描和处理的效率远远高于第三方库。


1.了解AVFoundation框架


AVFoundation框架是苹果官方提供的用于处理音频、视频的框架,其中主要包括如下的几个核心类,如图20-6所示。


2466108-610498d7d542003f.webp.jpg


图20-6 AVFoundation框架


AVCaptureSession:媒体(音、视频)捕获会话,负责把捕获的音视频数据输出到输出设备中。一个AVCaptureSession可以有多个输入输出。


AVCaptureDevice:输入设备,包括麦克风、摄像头,通过该类可以设置物理设备的一些属性,例如相机聚焦、白平衡等。


AVCaptureDeviceInput:设备输入数据管理类,可以根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,该对象将会被添加到AVCaptureSession中管理。

AVCaptureOutput:输出数据管理类,用于接收各类输出数据,通常使用对应的子类AVCapture-AudioDataOutput、AVCaptureStillImageOutput、AVCaptureVideoDataOutput、AVCaptureFileOutput,该对象将会被添加到AVCaptureSession中管理。


注意:前面几个类的对象输出数据都是NSData类型,而AVCaptureFileOutput代表数据以文件形式输出。


AVCaptureVideoPreviewLayer:相机拍摄预览图层,是CALayer的子类,使用该对象可以实时查看拍照或视频录制效果,创建该对象需要指定对应的AVCaptureSession对象。


2.二维码扫描功能实现


下面的示例代码,实现了扫描二维码功能,当程序运行后,会启动摄像头扫描二维码,并把扫描的结果打印出来。导入AVFoundation框架。


#import <AVFoundation/AVFoundation.h>


遵守AVCaptureMetadataOutputObjectsDelegate代理协议,并添加一个AVCaptureSession类的属性。


@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
@property (nonatomic, strong) AVCaptureSession *session;
@end


初始化AVCaptureSession对象的输入/输出以及其他属性。


- (void)viewDidLoad {
    [super viewDidLoad];
    //初始化相机设备
     AVCaptureDevice  *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //初始化输入流
     AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:weakSelf.device error:nil];
    //初始化输出流
     AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
    //设置代理,主线程刷新
     [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    //初始化链接对象
      self.session = [[AVCaptureSession alloc] init];
    //高质量采集率
     [self.session setSessionPreset:AVCaptureSessionPresetHigh];
     [self.session addInput:input];
     [self.session addOutput:output];
     //设置扫码支持的编码格式(如下设置二维码和条形码兼容)
     output.metadataObjectTypes = [NSArray arrayWithObjects:AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeInterleaved2of5Code,nil];
      AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
      layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
      //扫描框的位置和大小
      layer.frame = CGRectMake(60, 100, 200, 200);
      [self.view.layer insertSublayer:weakSelf.preview atIndex:0];
      [self.session startRunning];


在代理方法中获取扫描到的结果并传递给WebViewController对象。其中,WebViewController类继承自UIViewController类,在该类中提供了一个名为urlString的属性用于存储扫描到的网络地址。


- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    //扫描完成
    if (metadataObjects.count > 0) {
        AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0];
        //输出扫描字符串
        NSLog(@"%@", metadataObject.stringValue);
        //停止扫描
        [self.session stopRunning];
        //跳转控制器
        UIViewController *webVC = [[UIViewController alloc]init];
        webVC.urlString = metadataObject.stringValue;
        [self.navigationController pushViewController:webVC animated:YES];
     }
}


摘自《iOS开发:从零基础到精通》

目录
相关文章
|
存储 安全 数据安全/隐私保护
iOS开发之打包上传到App Store——(一)各种证书的理解
iOS开发之打包上传到App Store——(一)各种证书的理解
|
Ubuntu Linux 开发工具
Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
963 0
|
存储 设计模式 前端开发
Streamlit应用中构建多页面(三):两种方案(上)
Streamlit应用中构建多页面(三):两种方案
4556 0
|
存储 Ubuntu Linux
ceph的rbd块设备的使用指南
这篇文章介绍了如何在CentOS和Ubuntu环境下使用Ceph的RBD(Rados Block Device)进行块设备的创建、修改、删除和挂载操作。
940 3
|
JavaScript 前端开发
location.href和 window.location的区别有这些!
location.href和 window.location的区别有这些!
3752 3
|
开发工具 git
SourceTree配置BeyondCompare代码冲突解决工具
SourceTree配置BeyondCompare代码冲突解决工具
1023 0
|
存储 JavaScript 前端开发
基于SpringBoot+Vue高校校园点餐系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】(1)
基于SpringBoot+Vue高校校园点餐系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】
454 0
|
消息中间件 运维 Java
实现分布式事务处理的Java解决方案
实现分布式事务处理的Java解决方案
|
自然语言处理 程序员 开发工具
iOS生成Bundle 资源文件包与使用
iOS生成Bundle 资源文件包与使用
879 0
|
Java 测试技术 数据库
小区物业管理系统的设计与实现(论文+源码)_kaic
小区物业管理系统的设计与实现(论文+源码)_kaic

热门文章

最新文章