美文网首页
二维码扫描

二维码扫描

作者: 吴俊杰 | 来源:发表于2018-02-09 09:47 被阅读0次

    /** Capture 捕获

    1. 输入端Input (绑定输入设备-摄像头) (捕获摄像头画面的数据)
    2. 会话Session (协调处理输入与输出) (负责分配任务)
    3. 输出端Output (处理数据的一端) (数据处理--检查有没有二維码)
    4. 预览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];
      }

    相关文章

      网友评论

          本文标题:二维码扫描

          本文链接:https://www.haomeiwen.com/subject/mylazxtx.html