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];
四、原理示意图