多摄像头是在 Android Pie 中引入的,自几个月前发布以来,现现在已有多个支持该 API 的设备进入了市场,比如谷歌 Pixel 3 和华为 Mate 20 系列。许多多摄像头用例与特定的硬件配置紧密结合;换句话说,并非所有的用例都适配每台设备 — 这使得多摄像头功能成为模块 动态传输 的一个理想选择。一些典型的用例包括:
- 缩放:根据裁剪区域或所需焦距在相机之间切换
- 深度:使用多个摄像头构建深度图
- 背景虚化:使用推论的深度信息来模拟类似 DSLR(digital single-lens reflex camera)的窄焦距范围
逻辑和物理摄像头
要了解多摄像头 API,我们必须首先了解逻辑摄像头和物理摄像头之间的区别;这个概念最好用一个例子来说明。例如,我我们可以想像一个有三个后置摄像头而没有前置摄像头的设备。在本例中,三个后置摄像头中的每一个都被认为是一个物理摄像头。然后逻辑摄像头就是两个或更多这些物理摄像头的分组。逻辑摄像头的输出可以是来自其中一个底层物理摄像机的一个流,也可以是同时来自多个底层物理摄像机的融合流;这两种方式都是由相机的 HAL(Hardware Abstraction Layer)来处理的。
许多手机制造商也开发了他们自身的相机应用程序(通常预先安装在他们的设备上)。为了利用所有硬件的功能,他们有时会使用私有或隐藏的 API,或者从驱动程序实现中获得其他应用程序没有特权访问的特殊处理。有些设备甚至通过提供来自不同物理双摄像头的融合流来实现逻辑摄像头的概念,但同样,这只对某些特权应用程序可用。通常,框架只会暴露一个物理摄像头。Android Pie 之前第三方开发者的情况如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DEf8jzTc-1630588625832)(https://user-gold-cdn.xitu.io/2019/1/15/16850d666ae40717?imageView2/0/w/1280/h/960/ignore-error/1)]
相机功能通常只对特权应用程序可用
从 Android Pie 开始,一些事情发生了变化。首先,在 Android 应用程序中使用 私有 API 不再可行。其次,Android 框架中包含了 多摄像头支持,Android 已经 强烈推荐 手机厂商为面向同一方向的所有物理摄像头提供逻辑摄像头。因此,这是第三方开发人员应该在运行 Android Pie 及以上版本的设备上看到的内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pdM6b8t-1630588625834)(https://user-gold-cdn.xitu.io/2019/1/15/16850d666dc0cd2a?imageView2/0/w/1280/h/960/ignore-error/1)]
开发人员可完全访问从 Android P 开始的所有摄像头设备
值得注意的是,逻辑摄像头提供的功能完全依赖于相机 HAL 的 OEM 实现。例如,像 Pixel 3 是根据请求的焦距和裁剪区域选择其中一个物理摄像头,用于实现其逻辑相机。
多摄像头 API
新 API 包含了以下新的常量、类和方法:
CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
CameraCharacteristics.getPhysicalCameraIds()
CameraCharacteristics.getAvailablePhysicalCameraRequestKeys()
CameraDevice.createCaptureSession(SessionConfiguration config)
CameraCharactersitics.LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
OutputConfiguration
&SessionConfiguration
由于 Android CDD 的更改,多摄像头