AVCam 例程解读(III)
AVCam 是苹果公司为AVFoundation开发者准备的教学例程。该例程构建了一个最基本的ios摄影应用, 调用了大量AVFoundation的基本接口,考量了诸多使用AVFoundation可能出现的异常情况并展示了其处理方式, 同时说明了苹果公司在设计该API时背后的逻辑。本文大量参考 Apple 官方解读文档.
本文使用到的来自Apple的代码,文本以及图片,版权属于Apple.
AVCam(III): Handling Interruption and Errors
优秀的app需要考虑足够多的意外场景,设计合理的应对方式。本文总结一下AVCam里面处理过的异常情况.
addObservers()
- addObservers加了这些观察者:
- session的观察者,当session发生变化时对UI做更新
- 观察系统压力(systemPressure)
- 画面主体(
AVCaptureDeviceSubjectAreaDidChange
) - RuntimeError
- 中断开始事件
- 中断结束事件
对应的处理为:
- UI: 一口气获取Portrait, Live Photo, Depth等所有有UI关联的设置,并对所有UI更新。
- 系统压力级别:反应的是当前手机的整体流畅运行的状况,诸如运算压力过大,内存不足,温度过高等都会造成无法流畅运行。当压力到达
.serious
或者.critical
之后,将帧率控制在15~20帧。这里的数值需要根据特定app来调整。
- 画面主体变化:重新对焦
- 运行时错误:如果媒体服务被重置,且上一次启动成功,重启session。否则显示Resume按钮。
- 发生中断:首先在log上显示错误原因
- 音频/视频输入设备被其他应用抢占(Facetime, 电话等) -> 显示Resume
- IPad上在画中画/分屏模式时,因多任务导致资源紧张会停止相机服务 -> 显示Camera Unavailable
- 由于系统压力停止 -> 在log上记录
- 中断结束:隐藏Resume/Unavailable标签
Resume按键的处理
直接session.startRunning()
,如果启动失败,弹出alert。