AVCam 例程解读(II)

2019-02-05 · Technology · #IOS

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多种