/** Capture 捕获
- 输入端Input (绑定输入设备-摄像头) (捕获摄像头画面的数据)
- 会话Session (协调处理输入与输出) (负责分配任务)
- 输出端Output (处理数据的一端) (数据处理--检查有没有二維码)
- 预览Preview (获取数据, 展示出来) (看到摄像头的画面)
*/
// 处理音频与视频相关的框架, 在些的主要作用是获取摄像头数据
import <AVFoundation/AVFoundation.h>
@interface HMQRCodeViewController () <AVCaptureMetadataOutputObjectsDelegate>
/* 捕获会话 */
@property (strong, nonatomic) AVCaptureSession *session;
@end
/*
**
*/
-
(void)viewDidLoad
{
[super viewDidLoad];// -------- 1. 输入端 --------
// AVCaptureDevice 表示是的捕获设备 (关联硬件设备-摄像头)
// 第一次运行, 直接自动弹出授权窗口来请求用户, 能否访问摄像头
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];// AVCaptureInput 是数据捕获的输入端基类
// 从摄像头(硬件设备)上捕获数据 (关联捕获设备)
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
if (error) {
NSLog(@"输入端出错");
}// -------- 2. 捕获会话 --------
// 实例化
self.session = [[AVCaptureSession alloc] init];// 绑定输入端
if ([self.session canAddInput:input]) {
[self.session addInput:input];
NSLog(@"绑定了输入端");
}// -------- 3. 输出端 (获取数据, 处理二维码(特定格式的数据[某种数据类型]) ) --------
// Metadata 表示是元数据 (数据类型)
// AVCaptureOutput 是数据获取的输出端基类// AVCaptureMetadataOutput 是从捕获的数据当中, 截获特定类型的数据 (二维码)
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];// 与Session进行绑定
// 注意: 要先与session进行绑定, 才能获取对应的objectTypes
if ([self.session canAddOutput:output]) {
[self.session addOutput:output];
NSLog(@"输出端绑定成功");
}// 配置输出端 (指定解析的数据类型)
// 查看有效的数据解析类型
NSArray *objectTypes = output.availableMetadataObjectTypes;
NSLog(@"types: %@", objectTypes);// 1. 指定该输出端要解析的数据类型, 参数是包装了字符串的数组
output.metadataObjectTypes = @[@"org.iso.QRCode"];// 2. 配置回调的数据代理, 可以指定代理方法触发的线程
[output setMetadataObjectsDelegate:self queue:dispatch_get_global_queue(0, 0)];// -------- 4.启动会话 --------
[self.session startRunning];
}
pragma mark - AVCaptureMetadataOutputObjectsDelegate
-
(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
// ... 代理方法指定在哪里执行, 就会在哪个线程去执行该代码
NSLog(@"%@", [NSThread currentThread]);// metadataObjects是保存AVMetadataObject类型数据的数组
// 二维码扫描得到的对象是AVMetadataMachineReadableCodeObject类型
NSLog(@"%@", metadataObjects);// AVMetadataMachineReadableCodeObject 是最终的结果类型
AVMetadataMachineReadableCodeObject *object = metadataObjects.lastObject;
// 二维码的内容
NSString *result = object.stringValue;
NSLog(@"%@", result);// 停止会话的运行
[self.session stopRunning];
}
网友评论