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

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

AVCam(IV): In Progress State Modification

Photo <-> Movie toggleCaptureMode()

Movie -> Photo

首先将movieFileOutput移除,因为在movieFileOutput存在的前提下Live Photo无法启动。之后依次查询Live Photo, Depth Data 和 Portrait Matte的可用情况并视情况启动photoOutput的对应支持和UI。

Photo -> Movie

隐藏Photo模式的相关UI,添加一个AVCaptureMovieFileOutput。

Front <-> Back Camera changeCamera()

第一步,停用UI。之后获取当前使用的镜头位置,根据当前的位置判断要转换的目标。

Current Preferred
Front Back, .builtInDualCamera
Back Front, .builtInTrueDepthCamera

如果可以获取到preferred position和preferred device type,那么同时获取。否则只获取position。

接下来,将原先的videoDeviceInput移除,同时需要移除的还有subjectArea的observer,因为它与旧的device相关。然后加入新的observer,最后将device加入session。

将新的device加入之后,重新设置stabilization, livephoto, depth data, portrait matte等属性。在videoDevice被移除的时候,后三个属性都会自动被设置为否。

最后一步提示用户设置结束,启用UI