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