AVCam 例程解读(II)
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的这两个方法发生在didCapturePhoto
和didFinishCapture
之间,与Still管道中的方法没有指明先后。
AVCapturePhotoSettings
该对象定义了拍摄设置,拍摄图像数据该如何定义,如何后处理,以及应该包含哪些(超)图像数据。这里仅部分列举,详见API文档
设置 | 方法 |
---|---|
CFA排列储存格式 | init |
RAW文件格式 | init |
解贝尔像素格式 | init |
解贝尔文件格式 | init |
闪光 | flashMode |
采用内置稳定 | isAutoStillImageStabilizationEnabled |
双镜头融合 | isAutoDualCameraFusionEnabled |
双镜头双图像 | isDualCameraDualDeliveryEnabled |
相机校正数据 | isCameraCalibrationDataDeliveryEnabled |
LivePhoto, Depth, Portrait | 多种 |