项目中需要扫二维码、扫条形码,用了AVFoundation框架。
但是AVCaptureMetadataOutput扫条形码较弱,经常会有扫不到的情况,因此接入了google的MLKit。MLKit框架地址
Note: ML Kit iOS APIs only run on 64-bit devices. If you build your app with 32-bit support, check the device's architecture before using this API.
MLKit只支持64位,所以developmentinfo的version要改成10.0之后。(ios10.3之后弃用32位了)
我们只用到了sdk的扫码,所以直接pod 'GoogleMLKit/BarcodeScanning'
BarcodeScanning的大致原理是从摄像头的每一帧转为图片,再从图片中扫描是否有二维码、条形码。
导入框架后,然后修改AVCaptureMetadataOutput为AVCaptureVideoDataOutput
相应的delegate
从
- (void)captureOutput:(AVCaptureOutput *)captureOutputdidOutputMetadataObjects:(NSArray *)metadataObjectsfromConnection:(AVCaptureConnection *)connection;变为
- (void)captureOutput:(AVCaptureOutput *)captureOutputdidOutputSampleBuffer:(CMSampleBufferRef)sampleBufferfromConnection:(AVCaptureConnection *)connection ;
核心代码:
//图片输入
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];visionImage.orientation = image.imageOrientation;
//配置需要扫码的类型
MLKBarcodeScannerOptions *options =
[[MLKBarcodeScannerOptions alloc]
initWithFormats:
MLKBarcodeFormatEAN8 |
MLKBarcodeFormatCode128 |
MLKBarcodeFormatEAN13|
MLKBarcodeFormatQRCode];
//结果输出
MLKBarcodeScanner *barcodeScanner = [MLKBarcodeScanner barcodeScannerWithOptions:options];
[barcodeScanner processImage:visionImage
completion:^(NSArray *_Nullablebarcodes,
NSError *_Nullableerror) {
if(error !=nil) {
return;
}
if(barcodes.count >0) {
NSLog(@"扫到东西了");
for(MLKBarcode *barcode in barcodes) {
NSArray *corners = barcode.cornerPoints;
NSString *displayValue = barcode.displayValue;
NSString *rawValue = barcode.rawValue;
MLKBarcodeValueType valueType = barcode.valueType;
NSLog(@"displayValue:%@",displayValue);
NSLog(@"rawValue:%@",rawValue);
}
captureOutputdidOutputSampleBuffer代理方法输出帧数较高,可以加个定时器,比如隔0.5秒输出一次结果