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

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

#AVCam(I):Setup

主界面设计

MainStoryboard

设置CaptureSession

CaptureSession是调用IOS多媒体接口的核心,session管理connection对象,connection管理多个input和ouput对象。session还保留sessionQueue,对拍摄管道命令进行调度。configureSession()是初始设置的关键方法。

In general, it is not safe to mutate an AVCaptureSession or any of its inputs, outputs, or connections from multiple threads at the same time.

Don’t perform these tasks on the main queue because AVCaptureSession.startRunning() is a blocking call.

选择缺省输入设备

  • 镜头设备:根据设备的不同,初始化时用的输入设备也不同。利用AVCaptureDevice.default(deviceType:for:position:)。直至当前最高配置(iPhone XS Max)苹果手机最多配有2镜头(1广角1中焦)。 这里缺省镜头的选择过程为:后置双镜头(注意这里系统用两个镜头组合成为一个输入设备)->后置单镜头->前置单镜头->报错
  • 音频设备:AVCaptureDevice.default(:for:.audio:)

设置PreviewView方位

从NotificationBar上获取当前方位并赋予AVCapturePreviewLayer.connection?.videoOrientation 。注释中特别指出,所有对UI的修改都需要放在主线程中,对videoOrientation的修改不需要放在serialQueue中进行。

选择输出设备

初始设置中添加一个photoOutput, 在初始的photoOutput根据相机是否支持livePhoto, depthData和PortraitMatte来设置这些数据的输出开关。

AVCapturePhotoOutput.isLivePhotoEnabled
AVCapturePhotoOutput.isDepthDataDeliveryEnabled
AVCapturePhotoOutput.isPortraitEffectsMatteDeliveryEnabled