导入AVFoundation库,并将它加入
.pch
预编译文件给相机预览控制器
DTCameraPreviewController
添加四个私有成员,获取AVFoundation
的“终端”、“输入”、“输出”、“管理员”对象:
1 |
|
- 选取录制设备(摄像头或麦克风)
AVCaptureDevice
提供了一个类方法,指定一种媒体类型(AVMediaTypeVideo
or AVMediaTypeAudio
)它便能返回对应的录制设备。其他媒体类型可以在AVMediaFormat.h
中找到,不过它们不需要录制设备(如文本、字幕等)。
在DTCameraPreviewController.m
中实现_setupCamera
方法,用来初始化若干个AVFoundation
中用于录制的对象,
1 |
|
- 媒体录制“管理进程”
AVCaptureSession
是媒体录制进程的的管理员。控制着设备的输入输出。将输入添加至设备(_setupCamera
方法):
1 |
|
- 显示实时视频预览
苹果提供了预览层AVCaptureVideoPreviewLayer
,它可以提供摄像头画面的实时预览。因为它是CALayer的子类,将它封装至UIView
,方便使用。所以新建一个继承自UIView
的DTVideoPreviewView
类。头文件中,定义一个属性以获取视频预览层:
1 |
|
实现文件:
1 |
|
将storyboard中的根视图类型改为DTVideoPreviewView
。
在DTCameraPreviewController
中添加以下viewDidLoad
方法:
1 |
|
以及在_setupCamera
最后将预览图层添加至管理进程中:
1 |
|
至此,我们已将流程图中的AVCaptureDeviceInput
连至预览图层。
启动摄像头需调用-startRunning
1 |
|
- 设置闪光灯
1 |
|
- 抓取照片
完整的_setupCamera
:
1 |
|
获取当前链路:
1 |
|
拍照:
1 |
|
- 对焦
iOS有三种对焦模式:
1 |
|
监测扫描区域的变化:
1 |
|
一旦画面有变化,iOS系统就会发出AVCaptureDeviceSubjectAreaDidChangeNotification
通知,我们可以再-viewDidLoad
中订阅这一通知:
1 |
|