iOS 相机应用的核心 API 介绍

本文完整介绍一个拍照流程的过程,并简单介绍相关的 AVFoundation API。

核心流程

利用手机相机设备拍照或者录制,流程如下:

Devices -> Inputs -> Capture Session -> Outputs

AVCaptureSession 作为拍照流程的总管理者,是这个流程的核心。

如何实现?

1. 配置 AVCaptureSession

AVCaptureSession: 一个管理录制输入输出流程的对象。 AVCaptureDevice: 与物理设备的接口对象

这一步步骤如下:

  1. 创建一个 AVCaptureSession 对象
  2. 获取并配置 AVCaptureDevice 对象
  3. 使用 AVCaptureDevice 创建输入源 AVCaptureDeviceInput
  4. 配置一个 AVCapturePhotoOutput 对象来输出图像(UIImage?)
    • 使用 AVCapturePhotoSettings 配置图像格式

2. 在 UIView 显示相机图像

AVCaptureVideoPreviewLayer: 用来显示相机捕获图像的一个 CALayer 对象

  1. 使用 AVCaptureSession 创建 AVCaptureVideoPreviewLayer
  2. AVCaptureVideoPreviewLayer 通过 insertSublayer 方法添加为 UIView 的一个子layer
  3. 在 Info.plist 配置 NSCameraUsageDescription 想用户说明 App 获取相机权限的原因

在这一步,我们还可以使用 openGL 和 Metal 来渲染图像,就可以利用 GPU 优化渲染速度。

现在,我们可以在手机上显示相机捕获的图像了。

3. 捕获图像

  1. 调用 AVCapturePhotoOutput.capturePhoto 拍照
  2. 注册 AVCapturePhotoCaptureDelegate 的方法,获取 CMSampleBuffer
  3. AVCapturePhotoOutput.jpegPhotoDataRepresentationCMSampleBuffer 转行为 jpeg 格式的 UIImage
  4. 配置 info.plist 的 NSPhotoLibraryUsageDescription 并说明访问用户相册的原因
  5. UIImage 写入到文件

到这一步,拍照流程就完成了。

利用 AVFoundation 的 api,只需要将上述三个步骤串联起来,写一个相机应用程序十分简单。当然中间的多个环节都有许多优化空间,有机会的话我在将来的博客继续介绍。


推荐阅读 Building a Full Screen Camera App Using AVFoundation 官方文档:各型号 iPhone 的相机能力介绍

Posted 2018-05-05

More writing at jakehao.com