blob: 08c943f6f56b0e23eb6b3b24e4590339dbad43c0 [file] [log] [blame]
<html devsite><head>
<meta name="book_path" value="/_book.yaml"/>
<meta name="project_path" value="/_project.yaml"/>
</head>
<body>
<!--
Copyright 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<h1 id="multi-camera_support" class="page-title">多摄像头支持</h1>
<p>Android 9 通过一个新的逻辑摄像头设备(该设备由两个或两个以上指向同一方向的物理摄像头设备组成)引入了对多摄像头设备的 API 支持。该逻辑摄像头设备作为单个 CameraDevice/CaptureSession 提供给应用,从而允许与集成了 HAL 的多摄像头功能互动。应用可以选择访问和控制底层物理摄像头信息流、元数据和控件。</p>
<p><img src="/devices/camera/images/multi-camera.png" alt="多摄像头支持"/></p>
<p><strong>图 1</strong>. 多摄像头支持</p>
<p>在此图中,不同的摄像头 ID 用不同颜色标识。应用可以同时流式传输来自每个物理摄像头的原始缓冲区。您也可以设置单独的控件并从不同的物理摄像头单独接收元数据。</p>
<h2 id="examples_and_sources">示例和来源</h2>
<p>必须通过<a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA" class="external">逻辑多摄像头功能</a>播发多摄像头设备。</p>
<p>摄像头客户端可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getPhysicalCameraIds()" class="external"><code>getPhysicalCameraIds()</code></a>,查询构成特定逻辑摄像头的物理设备的摄像头 ID。随结果返回的 ID 之后会用于通过 <a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#setPhysicalCameraId(java.lang.String)" class="external"><code>setPhysicalCameraId()</code></a> 单独控制各个物理设备。可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/TotalCaptureResult.html#getPhysicalCameraResults()" class="external"><code>getPhysicalCameraResults()</code></a> 从完整结果中查询此类单个请求的结果。</p>
<p>单个物理摄像头请求可能仅支持有限的部分参数。要获得受支持参数的列表,开发者可以调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getAvailablePhysicalCameraRequestKeys()" class="external"><code>getAvailablePhysicalCameraRequestKeys()</code></a></p>
<p>只有非重新处理请求以及单色和 Bayer 传感器支持物理摄像头信息流。</p>
<h2 id="implementation">实现</h2>
<h3 id="support_checklist">支持核对清单</h3>
<p>要在 HAL 端添加逻辑多摄像头设备,请执行以下操作:</p>
<ul>
<li>为由两个或两个以上物理摄像头(这些摄像头也会提供给应用)提供支持的任何逻辑摄像头设备添加 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#232" class="external"><code>ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA</code></a> 功能。</li>
<li>使用物理摄像头 ID 列表填充静态 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#161" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS</code></a> 元数据字段。</li>
<li>填充在物理摄像头信息流的像素之间建立关联所需的深度相关静态元数据:<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#747" class="external"><code>ANDROID_LENS_POSE_ROTATION</code></a><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#753" class="external"><code>ANDROID_LENS_POSE_TRANSLATION</code></a><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#773" class="external"><code>ANDROID_LENS_INTRINSIC_CALIBRATION</code></a><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#780" class="external"><code>ANDROID_LENS_RADIAL_DISTORTION</code></a><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#79" class="external"><code>ANDROID_LENS_POSE_REFERENCE</code></a></li>
<li><p>将静态 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#167" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE</code></a> 元数据字段设置为:</p>
<ul>
<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#256" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE</code></a>:对于主主模式下的传感器,不执行硬件快门/曝光同步。</li>
<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#257" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED</code></a>:对于主从模式下的传感器,执行硬件快门/曝光同步。</li>
</ul></li>
<li><p>使用各个物理摄像头所支持参数的列表填充 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#106" class="external"><code>ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS</code></a>。如果逻辑设备不支持单个请求,则列表可以为空。</p></li>
<li><p>如果支持单个请求,则处理并应用可以在捕获请求中到达的各个 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/3.4/types.hal#226" class="external"><code>physicalCameraSettings</code></a>,并相应地附加单个 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/3.4/types.hal#289" class="external"><code>physicalCameraMetadata</code></a></p></li>
</ul>
<p>摄像头设备必须支持将一个逻辑 YUV/RAW 信息流替换为两个物理摄像头中大小(除 RAW 大小外)和格式相同的物理信息流。</p>
<h3 id="stream_configuration_map">信息流配置映射</h3>
<p>对于逻辑摄像头,特定硬件级别的摄像头设备的强制性信息流组合与 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html#createCaptureSession(java.util.List%3Candroid.view.Surface%3E,%20android.hardware.camera2.CameraCaptureSession.StateCallback,%20android.os.Handler)" class="external"><code>CameraDevice.createCaptureSession</code></a> 中所需的信息流组合相同。信息流配置映射中的所有信息流都应该是融合/逻辑框架。</p>
<p>如果某些信息流组合无法融合,则不应包含在逻辑摄像头的信息流配置映射中。但是,应用可以查找单个物理摄像头的信息流配置映射,并使用物理摄像头 ID 配置信息流。</p>
<p>这意味着逻辑摄像头的硬件级别可能低于单个摄像头的硬件级别。比如,两个物理摄像头具有不同的原始大小时。逻辑摄像头没有 RAW 功能,因此它不能是 LEVEL_3 设备,但各个物理摄像头可以是 LEVEL_3 设备。</p>
<p>对于逻辑摄像头和底层物理摄像头,直接配置的已处理信息流、RAW 信息流和终止信息流不应超过预定义的 <code>android.request.maxNumOutputStreams</code></p>
<h3 id="guaranteed_stream_combination">有保证的信息流组合</h3>
<p>逻辑摄像头及其底层物理摄像头都必须保证其设备级别所需的<a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice#createcapturesession_4" class="external">强制性信息流组合</a></p>
<p>逻辑摄像头设备的运行方式应该与物理摄像头设备相同,具体取决于其硬件级别和功能。建议将其特征集设为单个物理摄像头的特征集的超集。</p>
<p>此外,对于每个有保证的信息流组合,逻辑摄像头必须支持:</p>
<ul>
<li><p>将一个逻辑 YUV_420_888 或原始信息流替换为两个相同大小和格式的物理信息流(每个信息流来自不同的物理摄像头),只要物理摄像头支持这种大小和格式就可以。</p></li>
<li><p>添加两个原始信息流(在每个物理摄像头中各添加一个),条件是逻辑摄像头不播发 RAW 功能,但底层物理摄像头播发该功能。当两个物理摄像头具有不同的传感器尺寸时,通常会出现这种情况。</p></li>
</ul>
<p>只要物理信息流和逻辑信息流的最小帧时长相同,使用物理信息流代替相同大小和格式的逻辑信息流就不会减慢捕获的帧速率。</p>
<h3 id="performance_and_power_considerations">性能和功率考虑因素</h3>
<ul>
<li><p>性能:</p>
<ul>
<li>如果不附加物理摄像头设置,物理信息流应该不会降低捕获速率。</li>
<li>如果将底层摄像头设为不同的帧速率,则应用物理摄像头设置可能会降低捕获速率。</li>
</ul></li>
<li><p>功率:</p>
<ul>
<li>HAL 的功率优化在默认情况下继续有效。</li>
<li>配置或请求物理信息流可能会替换 HAL 的内部功率优化并消耗更多电量。</li>
</ul></li>
</ul>
<h2 id="customization">自定义</h2>
<p>您可以通过以下方式自定义设备实现。</p>
<ul>
<li>逻辑摄像头设备的融合输出完全取决于 HAL 实现。关于如何从物理摄像头派生融合逻辑信息流的决定对于应用和 Android 摄像头框架来说都是透明的。</li>
<li>可以选择支持单个物理请求和结果。此类请求中的可用参数集也完全取决于特定的 HAL 实现。</li>
</ul>
<h2 id="validation">验证</h2>
<p>逻辑多摄像头设备必须像任何其他普通摄像头一样通过摄像头 CTS 测试。可以在 <a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/" class="external"><code>LogicalCameraDeviceTest</code></a> 模块中找到针对此类设备的测试用例。</p>
<p>以下三个 ITS 测试针对多摄像头系统,以便于正确融合图像:</p>
<ul>
<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/scene1/" class="external"><code>scene1/test_multi_camera_match.py</code></a> </li>
<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/scene4/" class="external"><code>scene4/test_multi_camera_alignment.py</code></a> </li>
<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/sensor_fusion/" class="external"><code>sensor_fusion/test_multi_camera_frame_sync.py</code></a> </li>
</ul>
<p>scene1 和 scene4 测试使用<a href="/compatibility/cts/camera-its-box">盒装 ITS</a> 测试装置运行。当两个摄像头都启用时,<code>test_multi_camera_match</code> 测试会声明图像中心的亮度匹配。<code>test_multi_camera_alignment</code> 测试会声明摄像头间距、方向和失真参数已正确加载。如果多摄像头系统包含广视野摄像头(大于 90o),则需要 rev2 版 ITS 包装盒。</p>
<p><code>Sensor_fusion</code> 是另一个测试装置,它可以实现规定的重复手机动作,并声明陀螺仪和图像传感器时间戳匹配以及多摄像头帧保持同步。</p>
<p>所有测试盒都由 AcuSpec, Inc.(<a href="http://www.acuspecinc.com" class="external">www.acuspecinc.com</a>,fred@acuspecinc.com)和 MYWAY Manufacturing(<a href="http://www.myway.tw" class="external">www.myway.tw</a>,sales@myway.tw)提供。此外,rev1 ITS 测试盒可通过 West-Mark(<a href="http://www.west-mark.com" class="external">www.west-mark.com</a>,dgoodman@west-mark.com)购买。</p>
</body></html>