iOS AV Foundation 二维码扫描 01 使用摄像头

从这一节开始,我们使用AV Foundation制作一个条码(不仅仅是二维码)扫描程序,除了扫描二维码功能外,还具备语音合成和摄像头缩放功能。

创建名为ColloQR的单view应用程序。打开storyboard,禁用sized class。选中view controller,通过editor菜单将其放入navigation controller中。最后修改标题为ColloQR:

使用摄像头

打开ViewController.m,添加import:

@import AVFoundation;

在实现中定义以下实例变量:

@implementation ViewController {
    AVCaptureSession *_captureSession;
    AVCaptureDevice *_videoDevice;
    AVCaptureDeviceInput * _videoInput;
    AVCaptureVideoPreviewLayer *_previewLayer;
    BOOL _running;
}

AVCaptureSession:AVFoundation中的核心类,用于通过硬件获取、处理和输出视频。一个Capture Session由多个输入和多个输出组成,并控制输出帧的格式和分辨率。

AVCaptureDevice:封装设备上的物理摄像头。对iPhone而言有前后两个摄像头。

AVCaptureDeviceInput:要添加一个AVCaptureDevice到session中,需要用AVCaptureDeviceInput来包裹一下。

AVCaptureVideoPreviewLayer:用于显示摄像头捕捉到得视频到UI。

_running:用于存放session的状态,标明session在运行还是处于停止状态。

添加以下方法:

- (void) setupCaptureSession {
    if (_captureSession) return;

    _videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if (!_videoDevice) {
        NSLog(@"No video camera on this device!");
        return;
    }

    _captureSession = [[AVCaptureSession alloc] init];

    _videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:_videoDevice error:nil];

    if ([_captureSession canAddInput:_videoInput])
    {
        [_captureSession addInput:_videoInput];
    }

    _previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
}

这个方法用于建立capture session。

  • 如果session已经存在,则直接返回。
  • 初始化video device,若设备没有摄像头,则直接返回。
  • 初始化capture session。
  • 通过video device创建video input。
  • 查询session是否接受一个输入,如果接受,添加输入到session中。
  • 最后,创建预览层并为其指定要预览的capture session。

创建预览view

打开storyboard,添加一个UIView到view controller中,让其填充满整个view。并为其添加名为previewView的outlet。

回到ViewController.m,修改viewDidLoad方法,创建capture session,设置preview layer,让其填充满包含它的view,并将其设置为其容器view的子layer。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setupCaptureSession];
    _previewLayer.frame = _previewView.bounds;
    [_previewView.layer addSublayer:_previewLayer];
}

添加以下两个方法,用于启动和停止捕捉:

- (void) startRunning
{
    if (_running)
    {
        return;
    }
    [_captureSession startRunning];
    _running = YES;
}

- (void) stopRunning
{
    if (!_running)
    {
        return;
    }
    [_captureSession stopRunning];
    _running = NO;
}

添加另外两个方法,用于在view被显示前启动capture,在app进入后台时,停止capture:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self startRunning];
}

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self stopRunning];
}

修改viewDidLoad方法,注册以下两个通知:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];

实现通知处理方法:

- (void)applicationWillEnterForeground:(NSNotification *)note
{
    [self startRunning];
}

- (void)applicationDidEnterBackground:(NSNotification *)note
{
    [self stopRunning];
}

编译,在真机上执行(模拟器不支持摄像头)效果如下:

下一节,我们将为程序添加扫码功能。

转载请注明出处:http://blog.csdn.net/yamingwu/article/details/44498123

时间: 2024-10-18 12:10:51

iOS AV Foundation 二维码扫描 01 使用摄像头的相关文章

iOS AV Foundation 二维码扫描 02 扫码

AVFoundation支持以下一维和二维码的扫描: QR code Aztec EAN13 EAN8 UPC-E PDF417 Code 93 Code 39 Code 39 mode 41 QR code就是我们所熟知的二维码. 打开ViewController.m,添加以下实例变量: AVCaptureMetadataOutput *_metadataOutput; 当从视频帧中检测到元数据时,AVCaptureMetadataOutput会调用应用程序的回调函数.AV Foundatio

iOS AV Foundation 二维码扫描 04 使用合成语音朗读二维码内容

前一节,我们为程序识别到的二维码提供了可视化的显示,这一节,我们使用合成语音朗读扫描到的二维码的内容. 修改ViewController.m,定义以下实例变量并进行初始化: AVSpeechSynthesizer *_speechSynthesizer; _speechSynthesizer = [[AVSpeechSynthesizer alloc] init]; 初始化语音合成器十分简单.语音合成器会控制对每个语音数据的回放和顺序.初始化完成后,Metadata output将触发语音合成器

iOS AV Foundation 二维码扫描 03 为扫描到的二维码添加可视化效果

上一节,我们已经实现了二维码的扫描,这一节,我们利用元数据的bounds和corners实现一个可视化的扫描效果. bounds定义了包含二维码图像的矩形,corners定义了二维码图像的实际坐标: 当摄像头和二维码图片完全对齐时,bounds和corners就是相同的.但是通常来说,几乎不可能让摄像头和二维码完全对齐. 打开ViewController.m,添加以下实例变量,用于存放所有检测到得二维码,以二维码的内容为索引. NSMutableDictionary *_barcodes; 在v

iOS之原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIView *vie

iOS:原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI UI效果如图 IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIVi

iOS开发之二维码扫描

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 } span.s1 { } 二维码扫描 01-导入系统库 02 新建继承自UIView的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 } span.s1 { } LHQPreView 2.1导入系统库头文件 p.p1

iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能

如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.手机中二维码使用也很广泛,如微信等.正好最近收集总结了下二维码的使用方法 下面介绍一下如何在iOS设备上使用二维码 首先在github上下载ZBar SDK地址https://github.com/bmorton/ZBarSDK 然后将如下的相关类库添加进去 AVFoundation.framwork, CoreMedia.framework, CoreVideo.framework, libiconv.dylib 和libzb

IOS 使用 ZbarSDK 二维码扫描

1. 下载SDK   https://github.com/bmorton/ZBarSDK 2. 引用到项目中 3. 添加引用 4. AppDelegate中添加下面代码 5. 在需要使用扫描的controller中实现ZBarReaderViewDelegate 6. 对应的m文件中 #import "ViewController.h" @interface ViewController () { UITextField *resultText; ZBarReaderView *re

iOS开发-二维码扫描和应用跳转

iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦,出错也不方便调试.在iOS7之后,苹果自身提供了二维码的扫描功能,从效率上来说,原生的二维码远高于这些第三方框架.本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转.ps:本期的源代码会在文章结尾给出链接 扫描相关类 二维码扫描需要获取摄像头并读取