A64706b1f65cf64e66cd2f1b42f9069b
摄像新玩法:使用多个摄像头同时拍摄

Session 链接: WWDC 2019 Session 249

简介

iOS 13 引入了多相机拍摄(MultiCam),可以让多个摄像头同时工作获得图像输入。更新到 iOS 13 之后,便可以在 iPhone XSiPhone XS MaxiPhone XR 以及 iPad Pro3 这些设备上(iPhone X 就这样被抛弃了),最多可以让两个摄像头同时运行。例如对于 iPhone XS 可以有这些 MultiCam 组合:前置 + 后置广角、前置 + 后置远摄、后置双摄等等。

值得一提,最新的 ARKit 3 的某些特性也应用到了 MultiCam:前摄用于脸部以及姿势追踪,后摄用于场景识别。

下图是一个 MultiCam Demo 截图,同时获取前置以及后置摄像头的视频流,并同时在屏幕上预览:

新 API 的使用

AVCaptureMultiCamSession

在过去对 AVFoundation 的应用中,我们只能给 AVCaptureSession 指定一个 Input:

而现在我们有了 AVCaptureMultiCamSession,可以做到在一个 session 中添加多个 input:

并且通过与 Previewer 以及 Output 等部件的组合得到更加灵活的应用:

连接(Connection)

过去我们使用 AVCaptureSession 的时候,Session 会自动将 Input 里面合适的 Port 与 Output 进行连接:

但对于 MultiCamSession,建议的做法是手动指定相关的连接。在配置 Session 时,使用这些接口来告诉 Session 不要自动建立 Connection:

  • Inputs & Output: addInputWithNoConnections or addOutputWithNoConnections;
  • Preview layers: AVCaptureVideoPreviewLayer.setSessionWithNoConnections();

配置完成之后,再手动创建 Connection 并添加到 Session 中:

  • 创建 Connection: 生成 AVCaptureConnection 对象;
  • 添加 Connection: 通过 Session 的 addConnection 方法添加;

MultiCam 的限制

1) 不能把一个 Device 使用到两个 Input 中来企图得到「假双输入」:

2) 一个 Input 不能分为连接到两个同类型的 Output:

3) 一个 Ouput 只能接受一个 Input:

4) MultiCamSession 不能通过 Preset 来指定 Input 的质量,需要手动为每一个 Input 指定它们各自的格式;

Hardware Costs

在多摄像头同时工作的情况下,虽然说是有多个传感器(CMOS)在工作,但 ISP(Image Signal Processor) 只有一个,所有摄像头采集到的数据都要经过这一个 ISP 的处理。而 ISP 在每个时钟周期内可处理的像素数目是有限的。

影响硬件资源消耗的因素主要有下面几点:

  • 视频分辨率:分辨率越高像素点自然就越多;
  • 最大帧率:帧率越高单位时间内像素点自然越多;
  • Sensor Binning:一种合并相邻像素以提高处理速度并降低能耗,但会降低图像质量的图像处理方式;

硬件资源消耗的衡量指标

可以通过下面这个新增的属性来进行资源消耗程度的衡量,当你增加的 Input/Output 或者其他特性越多,它的值就会越高:
```swift
multicamSession.hardwareCost

top Created with Sketch.