Android 平台支持使用即插即用的 USB 摄像头(即摄像头),但前提是这些摄像头采用标准的 Android Camera2 API 和摄像头 HAL 接口。网络摄像头通常支持 USB 视频类 (UVC) 驱动程序,并且在 Linux 上,系统采用标准的 Video4Linux (V4L) 驱动程序控制 UVC 摄像头。
如果系统支持网络摄像头,设备便可用于视频聊天和照片冲印机等轻量级用例。此功能不能替代 Android 手机上典型的内部相机 HAL,也不是为了协助执行涉及高分辨率和高速流式传输、AR 以及手动 ISP/传感器/摄像头控制且对性能要求很高的复杂任务。
USB 相机 HAL 进程是外接摄像头提供程序的一部分,该提供程序会监听 USB 设备可用性,并相应地枚举外接摄像头设备。该进程具有与内置相机 HAL 进程类似的权限和 SE 策略。直接与 USB 设备通信的第三方网络相机应用访问 UVC 设备时所需的相机权限与所有常规相机应用所需的权限相同。
如需详细了解如何实现 USB 摄像头,请参阅 中的外接摄像头提供程序参考实现。外接摄像头设备和会话实现包含在 和 中。从 API 级别 28 开始,Java 客户端 API 包含 硬件级别。
实现必须支持 系统功能。
此外,还必须启用对 UVC 设备的内核支持。您可以通过将以下内容添加到相应的内核 文件来启用该支持。
如需在相应的设备 build 中启用外接摄像头提供程序,以便添加必要的 SELinux 权限、外接摄像头配置以及外接摄像头提供程序依赖项,请完成以下步骤:
将外接摄像头配置文件和外接摄像头库添加到 。
将外接摄像头提供程序名称添加到设备 Treble HAL 清单。
(可选)如果设备在 Treble 直通模式下运行,请更新 ,以便 可以访问 UVC 摄像头。
下面的示例展示了 (省略了版权行)。
您可以通过常规自定义选项或设备专用的优化来提升 Android 摄像头的性能。
您可以通过修改 文件来自定义外接摄像头提供程序。具体而言,客户可以自定义以下参数:
- 内部摄像头的排除视频节点
- 支持的图片大小和帧速率上限
- Inflight 缓冲区数量(在卡顿与内存之间进行权衡)
除了这些参数之外,您还可以添加自己的参数或开发自己的配置。
您还可以通过添加设备专用的优化来提升性能。
缓冲区复制/调整大小和 JPEG 解码/编码
通用实现使用的是 CPU (libyuv/libjpeg),但您可以将其替换为设备专用的优化。
HAL 输出格式
通用实现采用以下输出格式:
- :适用于视频 缓冲区
- :适用于所有其他 缓冲区
为了提升性能,您可以将输出格式替换为设备专用的高效格式。此外,您还可以在自定义的实现中支持其他格式