二维码扫描

/** Capture 捕获

  1. 输入端Input (绑定输入设备-摄像头) (捕获摄像头画面的数据)
  2. 会话Session (协调处理输入与输出) (负责分配任务)
  3. 输出端Output (处理数据的一端) (数据处理--检查有没有二維码)
  4. 预览Preview (获取数据, 展示出来) (看到摄像头的画面)
    */

// 处理音频与视频相关的框架, 在些的主要作用是获取摄像头数据
import
@interface HMQRCodeViewController ()
/* 捕获会话 */
@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];
    }

你可能感兴趣的:(二维码扫描)