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
    • 中断开始事件
    • 中断结束事件

对应的处理为:

  1. UI: 一口气获取Portrait, Live Photo, Depth等所有有UI关联的设置,并对所有UI更新。
  2. 系统压力级别:反应的是当前手机的整体流畅运行的状况,诸如运算压力过大,内存不足,温度过高等都会造成无法流畅运行。当压力到达.serious或者.critical之后,将帧率控制在15~20帧。

    这里的数值需要根据特定app来调整。

  3. 画面主体变化:重新对焦
  4. 运行时错误:如果媒体服务被重置,且上一次启动成功,重启session。否则显示Resume按钮。
  5. 发生中断:首先在log上显示错误原因
  6. 音频/视频输入设备被其他应用抢占(Facetime, 电话等) -> 显示Resume
  7. IPad上在画中画/分屏模式时,因多任务导致资源紧张会停止相机服务 -> 显示Camera Unavailable
  8. 由于系统压力停止 -> 在log上记录
  9. 中断结束:隐藏Resume/Unavailable标签

Resume按键的处理

直接session.startRunning(),如果启动失败,弹出alert。