前言
在开发中,我们使用UIImagePickerController
可以很简单的使用系统的相机进行拍照,但这个固定样式的相机并不灵活。很多时候,我们可能需要自定义相机、需要录制音频。这时候就需要使用 AVFoundation 获取摄像头与麦克风的信息来进行拍照、录制视频和录制音频的操作。
该系列的文章处于不断更新的过程中,项目地址如下:SCCamera
【iOS】自定义相机(二)权限获取
【iOS】自定义相机(三)预览视图
【iOS】自定义相机(四)会话配置
【iOS】自定义相机(五)相机设置
【iOS】自定义相机(六)拍照与录像
【iOS】自定义相机(七)人脸检测
欢迎各位提出自己宝贵的建议,谢谢!觉得有用的可以点个赞或者Star一下哦~
AVFoundation 媒体捕获架构
AVCaptureSession
是在做自定义相机里面最重要的一个类,我们需要将各种音视频捕获的输入(AVCaptureInput
)与输出(AVCaptureOutput
)添加到session
中。最终通过运行session
来让这些输入输出协同工作起来。
上图中左侧的属于AVCaptureInput
,右侧的属于AVCaptureOutput
。箭头的指向表示的是一个音视频流输入和输出的方向。
-
AVCaptureSession
:捕捉会话- AVFoundation 媒体捕获的核心类
- 一个捕捉会话相当于一个虚拟的“插线板”,用于连接输入和输出的资源
-
AVCaptureDevice
:捕捉媒体设备- 摄像头和麦克风等物理设备的接口
-
AVCaptureInput
:捕捉输入-
AVCaptureDeviceInput
:音视频捕获设备输入类- 需要使用
AVCaptureDevice
创建 - 音频和视频需要使用麦克风和摄像头分别获取
- 需要使用
-
-
AVCaptureOutput
:捕捉输出-
AVCaptureVideoDataOutput
:视频数据输出类- 通过
AVCaptureVideoDataOutputSampleBufferDelegate
获取视频流数据,即视频中每一帧的数据
- 通过
-
AVCaptureAudioDataOutput
:音频数据输出类- 通过
AVCaptureAudioDataOutputSampleBufferDelegate
获取音频流数据,即每一帧的音频数据
- 通过
-
AVCaptureMetadataOutput
:识别结果输出类- 通过
AVCaptureMetadataOutputObjectsDelegate
获取系统原生的识别结果 - 可以用来进行简单的人脸检测、二维码扫描,具体需要调用
[_metaOutput availableMetadataObjectTypes]
查看当前设备支持的识别功能
- 通过
-
AVCaptureStillImageOutput
:静态图片输出类- 用于进行拍摄静态照片
- 在iOS10被弃用,需要使用
AVCapturePhotoOutput
来替代(AVCapturePhotoOutput
将会在后面的文章中进行介绍)
-
AVCaptureMovieFileOutput
:视频文件输出类- 用于进行视频录制
- ※ 现在
AVCaptureMovieFileOutput
还不能与AVCaptureVideoDataOutput
共用,所有后面我将提供两种录制视频的方式
-
-
AVCaptureVideoPreviewLayer
:预览显示用的CALayer
- 将相机采集到的视频数据渲染到
Layer
上,进行预览鲜果展示 - 通过设置该类的
session
属性为当前AVCaptureSession
对象即可,十分方便快捷
- 将相机采集到的视频数据渲染到
-
AVCaptureConnection
:连接- 在上图中,其实还有一个类没有明确的名字,而是由一个连接不同组件的黑色箭头所表示
- 捕捉会话首先需要确定由给定捕捉设备输入渲染的媒体类型,并自动创建其能够接受该媒体类型的捕捉输出端的连接
自定义相机架构设计
整体架构整体采用 MVC 进行架构,主要是将视图布局和复杂的 AVFoundation 对象操作使用分层,并且采用 Manager 来独立封装摄像头操作、拍照操作、录制视频操作。
架构优点
- 分层:视图层与逻辑层区分,使得 UI 层的修改十分方便
-
封装:对 AVFoundation 中的操作进行分类,分成三个不同
Manager
,有助于增加SCCameraController
中代码的可读性 -
灵活:
SCCameraController
持有session
和各种输入输出。这种方式看似比较杂乱,但比较具有灵活性。我们只需要将需要用到的视图、需要的输入输出和对应的操作Manager
组合在一起就可以完成对应的需求。
自定义相机启动主要流程
- 检查相机与麦克风权限
- 创建
AVCaptureSession
对象 - 创建
AVCaptureDeviceInput
并添加到session
中 - 设置
AVCaptureVideoPreviewLayer
的session
属性,显示预览效果 - 创建
AVCaptureDeviceOutput
并添加到session
中 -
[session startRunning]
开始工作
网友评论