iOS原生扫码实现及原理

一、扫码需要配置下面五个部分:
  AVCaptureDevice            * device;   //设备  手机的摄像机
 AVCaptureDeviceInput       * input; //输入设备
 AVCaptureMetadataOutput    * output;//输出设备
 AVCaptureSession           * session; //控制器 连接输入输出设备

 AVCaptureVideoPreviewLayer * preview; //视图 显示相机的范围

二、概念

1.条形码类别:
AVF_EXPORT NSString *const AVMetadataObjectTypeUPCECode
AVF_EXPORT NSString *const AVMetadataObjectTypeCode39Code
AVF_EXPORT NSString *const AVMetadataObjectTypeCode39Mod43Code
AVF_EXPORT NSString *const AVMetadataObjectTypeEAN13Code  
AVF_EXPORT NSString *const AVMetadataObjectTypeEAN8Code
AVF_EXPORT NSString *const AVMetadataObjectTypeCode93Code
AVF_EXPORT NSString *const AVMetadataObjectTypeCode128Code
AVF_EXPORT NSString *const AVMetadataObjectTypePDF417Code
AVF_EXPORT NSString *const AVMetadataObjectTypeQRCode //二维码
AVF_EXPORT NSString *const AVMetadataObjectTypeAztecCode
AVF_EXPORT NSString *const AVMetadataObjectTypeInterleaved2of5Code
AVF_EXPORT NSString *const AVMetadataObjectTypeITF14Code
AVF_EXPORT NSString *const AVMetadataObjectTypeDataMatrixCode

2.采集的质量:
AVCaptureSessionPresetPhoto //不支持流媒介 全照片
AVCaptureSessionPresetHigh   //高清
AVCaptureSessionPresetMedium //中等 适合wifi环境
AVCaptureSessionPresetLow  //低 适合3G网络
AVCaptureSessionPreset320x240  //其它配置
AVCaptureSessionPreset352x288
3.扫描显示:
AVLayerVideoGravityResize, //拉伸视频以填充可用屏幕区域,即使这样做会扭曲的形象
AVLayerVideoGravityResizeAspect //保留宽高比,留下黑边,其中视频不填充可用屏幕区域
AVLayerVideoGravityResizeAspectFill //保留高宽比,但填充可用的屏幕区域,必要时裁剪视频

4.扫描媒体:

AVMediaTypeVideo           
 AVMediaTypeAudio             
AVMediaTypeText         
AVMediaTypeClosedCaption           
AVMediaTypeSubtitle   
AVMediaTypeTimecode      
AVMediaTypeMetadata               
AVMediaTypeMuxed

三、实施

  // Device  媒体类型很多,但实际基本只用AVMediaTypeVideo,用其它会导致程序崩溃,原因没有细究
    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];   
    // Input  将设备作为输入设备的信息来源
    _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];   
    // Output 输出设备 需要设置代理和队列 一般使用主队列
    _output = [[AVCaptureMetadataOutput alloc]init];
    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];   
   // 条码类型 AVMetadataObjectTypeQRCode
    _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];   
    // 生成控制器
    _session = [[AVCaptureSession alloc]init];
//设置采集的质量
 [_session setSessionPreset:AVCaptureSessionPresetHigh];
//添加输入设备
    if ([_session canAddInput:self.input])
    {
        [_session addInput:self.input];
    }   
//添加输出设备
    if ([_session canAddOutput:self.output])
    {
        [_session addOutput:self.output];
    }   

    // Preview 扫描视图,扫描范围
    _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
    _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    _preview.frame =CGRectMake(0,0,ScreenWidth,ScreenHeight);
    [self.view.layer insertSublayer:self.preview atIndex:0];  
     // Start 启动
    [_session startRunning];


四、原理示意图





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值