iOS 相机应用的核心 API 介绍
本文完整介绍一个拍照流程的过程,并简单介绍相关的 AVFoundation API。
核心流程
利用手机相机设备拍照或者录制,流程如下:
Devices
-> Inputs
-> Capture Session
-> Outputs
AVCaptureSession
作为拍照流程的总管理者,是这个流程的核心。
如何实现?
1. 配置 AVCaptureSession
AVCaptureSession
: 一个管理录制输入输出流程的对象。
AVCaptureDevice
: 与物理设备的接口对象
这一步步骤如下:
- 创建一个
AVCaptureSession
对象 - 获取并配置
AVCaptureDevice
对象 - 使用
AVCaptureDevice
创建输入源AVCaptureDeviceInput
- 配置一个
AVCapturePhotoOutput
对象来输出图像(UIImage?)- 使用
AVCapturePhotoSettings
配置图像格式
- 使用
2. 在 UIView 显示相机图像
AVCaptureVideoPreviewLayer
: 用来显示相机捕获图像的一个 CALayer
对象
- 使用
AVCaptureSession
创建AVCaptureVideoPreviewLayer
- 将
AVCaptureVideoPreviewLayer
通过insertSublayer
方法添加为UIView
的一个子layer - 在 Info.plist 配置
NSCameraUsageDescription
想用户说明 App 获取相机权限的原因
在这一步,我们还可以使用 openGL 和 Metal 来渲染图像,就可以利用 GPU 优化渲染速度。
现在,我们可以在手机上显示相机捕获的图像了。
3. 捕获图像
- 调用
AVCapturePhotoOutput.capturePhoto
拍照 - 注册
AVCapturePhotoCaptureDelegate
的方法,获取CMSampleBuffer
AVCapturePhotoOutput.jpegPhotoDataRepresentation
将CMSampleBuffer
转行为 jpeg 格式的UIImage
- 配置 info.plist 的
NSPhotoLibraryUsageDescription
并说明访问用户相册的原因 - 将
UIImage
写入到文件
到这一步,拍照流程就完成了。
利用 AVFoundation 的 api,只需要将上述三个步骤串联起来,写一个相机应用程序十分简单。当然中间的多个环节都有许多优化空间,有机会的话我在将来的博客继续介绍。
推荐阅读 Building a Full Screen Camera App Using AVFoundation 官方文档:各型号 iPhone 的相机能力介绍
Posted 2018-05-05