AVCam 是苹果公司为AVFoundation开发者准备的教学例程。该例程构建了一个最基本的ios摄影应用, 调用了大量AVFoundation的基本接口,考量了诸多使用AVFoundation可能出现的异常情况并展示了其处理方式, 同时说明了苹果公司在设计该API时背后的逻辑。本文大量参考 Apple 官方解读文档.

本文使用到的来自Apple的代码,文本以及图片,版权属于Apple.

AVCam(II): Capture A Photo

启动拍摄命令

AVCapturePhotoOutput.capturePhoto(with:AVCapturePhotoSettings, delegate:AVCapturePhotoDelegate)

AVCapturePhotoDelegate

拍摄命令启动后,session会启动capture管道: AVTimelineStill, Apple Inc.

生命周期每个阶段开始/结束时都会呼叫回调函数,这些函数全部通过AVCapturePhotoDelegate定义。AVCam例程的处理方法是定义PhotoCaptureProcessor对象,使其满足Delegate,将大块的代码单独管理。

Desired Settings:指用户期待的拍摄设置 Resolved Settings:指系统解析后实际的拍摄设置,会回传到所有回调函数

过程 时间点 AVCam行为
willBeginCapture 执行命令后第一个回调,快门声之前 判断是否livephoto并记录
willCapturePhoto 快门声后 闪屏
didCapturePhoto 拍摄结束
didFinishProcessingPhoto 图像处理结束,传入处理结果和metadata 保存Photo,Portrait跟Depth数据
didFinishCapture 管道最后一个方法 将Photo, LivePhoto(Movie)写入photo library

涉及Live Photo模式的拍摄管道会多两个方法:

过程 时间点 AVCam行为
didFinishRecordingLivePhoto… livephoto录制结束 关闭live photo提示,decrement completion counter
didFinishProcessingLivePhoto… livephoto写入磁盘 记录磁盘位置,提示错误

注1:由于live photo拍摄可以有重叠(前后两次按快门的间隔短),所以live photo标志的提示需要在completion counter==0时才去掉。

注2:live photo的短视频是自动在管道中已经存储完成的,地址通过AVCaptureSettings.livePhotoFileURL提前定义。

注3:live photo的这两个方法发生在didCapturePhotodidFinishCapture之间,与Still管道中的方法没有指明先后。

AVCapturePhotoSettings

该对象定义了拍摄设置,拍摄图像数据该如何定义,如何后处理,以及应该包含哪些(超)图像数据。这里仅部分列举,详见API文档

设置 方法
CFA排列储存格式 init
RAW文件格式 init
解贝尔像素格式 init
解贝尔文件格式 init
闪光 flashMode
采用内置稳定 isAutoStillImageStabilizationEnabled
双镜头融合 isAutoDualCameraFusionEnabled
双镜头双图像 isDualCameraDualDeliveryEnabled
相机校正数据 isCameraCalibrationDataDeliveryEnabled
LivePhoto, Depth, Portrait 多种