Zoom 和 Google Meet 等视频会议平台在新冠疫情期间迅速普及,但网络摄像头市场却难以跟上。最好的网络摄像头很难获得或太昂贵,导致大多数人转向更便宜、更容易获得的网络摄像头或笔记本电脑的集成网络摄像头。不过,大多数智能手机中的摄像头提供的图像质量明显优于绝大多数网络摄像头,因此许多人在手机上安装了第三方软件,将其变成网络摄像头。从Android 14开始,可能不需要使用第三方应用程序将智能手机变成 PC 的网络摄像头,因为该功能已融入 Android 操作系统本身 - 尽管有一个问题。
当您将 Android 手机插入 PC 时,您可以选择在文件传输/Android Auto (MTP)、USB 网络共享 (NCM)、MIDI 或 PTP 之间更改 USB 模式。然而,在 Android 14 中,USB 首选项中会出现一个新选项:USB 网络摄像头。选择此选项会将 USB 模式切换为 UVC(USB 视频类)(如果设备支持),将您的 Android 设备变成其他设备可以识别的标准 USB 网络摄像头,包括 Windows、macOS 和 Linux PC,甚至可能是其他Android设备。
然而,Android 14 中的网络摄像头支持并不是开箱即用的。为了启用它,需要四件事:需要启用 Linux 内核配置、需要配置 UVC 设备、需要更新 USB HAL 以及需要预加载新的系统应用程序。
内核配置
Linux 内核配置 ( CONFIG_USB_CONFIGFS_F_UVC ) 是必需的,以便 Android 设备可以作为 UVC 小工具安装。幸运的是,许多升级到 Android 14 的设备以及几乎所有启动 Android 14 的设备都将具有启用此配置的内核。这是因为它在从 android12-5.10 及更高版本开始的通用内核映像 (GKI) 版本上默认启用,并且在 Linux 内核版本 5.10 或更高版本上运行 Android 12 或更高版本的设备需要发布 GKI 内核。
由于主要内核版本升级在 Android 领域很少见,而且Google 需求冻结 (GRF) 计划允许较旧的供应商实现仍然可认证,因此某些升级到 Android 14 的设备将不具有支持 USB 网络摄像头功能的内核。很难将此类设备的列表放在一起,因此判断您的设备是否有能力的最佳方法是检查其内核版本以及配置是否已启用。
要检查设备的内核版本,请运行:
adb shell “cat /proc/version”
然而,要实际验证内核配置是否已启用,需要运行另一个命令来查看“CONFIG_USB_CONFIGFS_F_UVC”是否出现在 config.gz 中,config.gz 是用于在设备上构建内核的配置文件的压缩副本。
adb shell "zcat /proc/config.gz | grep 'CONFIG_USB_CONFIGFS_F_UVC'"
例如,以下是运行 Android 13 的 Galaxy Z Fold 5 的输出。由于它使用 android13-5.15 GKI 并且由于“CONFIG_USB_CONFIGFS_F_UVC=y”,因此一旦升级到 Android 14,它应该能够支持 USB 网络摄像头功能不过,这是假设该设备满足我之前提到的其他先决条件。
网络摄像头服务应用程序
在适用于部分 Pixel 设备的 Android 14 QPR1 Beta 中,有一个名为“网络摄像头服务”(com.android.deviceaswebcam) 的新系统应用。此应用程序依赖于名为 libjni_deviceAsWebcam.so 的共享库。此应用和库将作为 Android 14 即将发布的源代码版本的一部分包含在内。
网络摄像头服务应用程序实现了“DeviceAsWebcam”服务,我之前曾报道过该服务将“将 Android 设备变成网络摄像头”。该服务将相机帧转发到主机设备可以读取的 /dev/video 节点。SELinux 策略规定仅在 device_as_webcam 域中进行处理,即。只有网络摄像头服务系统应用程序可以访问 /dev/video 节点。因此,只有设备制造商而非任何第三方才能真正利用 Android 14 的本机 USB 网络摄像头支持。
网络摄像头服务应用程序实际上如何知道何时开始转发摄像头帧?当切换“USB首选项”中的新“USB网络摄像头”选项时,系统会广播 android.hardware.usb.action.USB_STATE 意图以及“已连接”和“uvc”意图附加信息。网络摄像头服务有一个用于此意图的接收器,如果“uvc”意图额外设置为“true”并且框架方法 android.hardware.usb#isUvcSupportEnabled() 返回 true,则会启动系统服务。
当系统属性“ro.usb.uvc.enabled”设置为 true 时,isUvcSupportEnabled() 方法返回 true。该属性必须由 OEM 在构建时设置,如果未设置,“USB 首选项”将不会显示“USB 网络摄像头”选项,网络摄像头服务也不会启动。此属性只能由系统应用(例如“设置”和“网络摄像头服务”应用)读取。
当网络摄像头服务启动时,会发布一条新通知,让用户配置网络摄像头。点击通知会打开相机预览,用户可以在其中放大或缩小或更换镜头。在后台,网络摄像头服务应用程序启动前台服务以确保系统保持其活动状态。它使用 Camera2 API 并支持 720p (1280x720) 或 1080p (1920x1080p) 分辨率的流式传输。网络摄像头设备在连接的主机上显示为“Android Webcam”。
ConfigFS 和 USB HAL
确切的编码方法、视频参数和向主机显示的名称取决于设备制造商如何使用 configfs 设置 UVC 小工具。例如,在 Tensor 支持的 Pixel 设备上,Google 的 UVC 小工具功能配置可以在位于 /vendor/etc/init/hw 的 init.gs[101|201].usb.rc 文件中找到。
此外,该设备需要更新的 USB HAL,以便 Android 能够在“设置”中选择该选项时将 USB 模式切换到 UVC。然而,由于上述 GRF 计划,许多升级到 Android 14 的设备可能不会收到更新的 USB HAL,这意味着此功能将无法使用。
结论
很高兴看到 Google 在 Android 中实现原生 USB 网络摄像头功能。假设网络摄像头服务应用程序将按照我们的预期在 AOSP 中提供,这意味着任何希望实现网络摄像头功能的设备制造商都可以使用此功能。许多人会将此功能称为苹果“连续性相机”的克隆,但值得注意的是,Android 版本适用于多个平台。任何运行 Android 14 且满足本文提到的要求的手机都可以变成适用于任何 PC 的标准 USB 网络摄像头,这是一件大事。