Cómo usar un dispositivo como cámara web

Para los dispositivos que ejecutan Android 14-QPR1 o versiones posteriores, Android admite el uso de dispositivo como cámara web por USB. Los dispositivos Android que admiten esta función se anuncian como un dispositivo UVC, lo que permite una amplia variedad de hosts USB sistemas operativos (por ejemplo, Linux, macOS, Windows y ChromeOS) usan el la cámara del dispositivo como cámara web. El servicio DeviceAsWebcam admite esta función para usar el dispositivo como cámara web.

Servicio DeviceAsWebcam

El servicio DeviceAsWebcam en AOSP incluye una actividad de vista previa (DeviceAsWebcamPreview.java) que permite a los usuarios enmarcar la escena. Vista previa La actividad le permite al usuario hacer lo siguiente:

  • Obtén una vista previa de cómo se verá el feed de la cámara web en la máquina anfitrión antes de transmitir comienza el ciclo de vida.

  • Personaliza el feed de la cámara web enviado al anfitrión de las siguientes maneras:

    • Selección de la cámara para transmitir, frontal o posterior.
    • Selección del nivel de zoom con un control deslizante o botones
    • Presionar una región en particular de la vista previa para enfocar o quitar el enfoque en una región.

La actividad de vista previa funciona con funciones de accesibilidad generales en Android, como como TalkBack, Accesibilidad con interruptores y Acceso por voz.

Feed de cámara web transmitido al organizador

Figura 1: El feed de cámara web se transmite a un host cuya vista previa controla la feed.

Arquitectura

En el siguiente ejemplo, se ilustra la arquitectura para admitir el uso de un dispositivo como cámara web Figura 2: A continuación, se describe el flujo de interacción de DeviceAsWebcam. servicio con el resto del framework de Android:

  1. El usuario selecciona la opción de cámara web USB en la app de Configuración.
  2. La app de Configuración envía una llamada de Binder a system_server mediante el Clase UsbManager que le informa que se seleccionó FUNCTION_UVC.
  3. El servidor del sistema hace lo siguiente:
    1. Informa a la HAL del gadget USB que recupere la función del gadget de UVC a través de un Llamada a la interfaz de HAL de setUsbFunctions.
    2. Informa a la HAL de gadgets USB que debe configurar el controlador de gadgets UVC utilizando los ConfigF.
  4. Al recibir una devolución de llamada de la HAL del gadget, system_server envía una transmisión al framework para que el servicio DeviceAsWebcam lo detecte.
  5. El controlador del gadget USB inicia la transmisión de la cámara web al recibir la configuración. comandos del host a través de nodos V4L2 en /dev/video*.

dispositivo como arquitectura de cámara web

Figura 2: Arquitectura de DeviceAsWebcam.

Implementación

En esta sección, se describe cómo admitir el uso de un dispositivo Android como cámara web.

Compatibilidad con kernel

En el caso de Android 14 o versiones posteriores, la imagen genérica del kernel (GKI) habilita el widget de UVC. controlador de forma predeterminada (consulta los detalles en el parche de AOSP).

Compatibilidad con UVC en la HAL del aparato

A partir de Android 14, la función UVC se incluye en el GadgetFunction.aidl Interfaz de la HAL. Para la HAL del aparato, la UVC se activa en ConfigFS de la misma manera que otras funciones de ConfigFS, como como MTP o ADB.

Para implementar la HAL del gadget, realiza modificaciones para activar la función UVC en ConfigFS. El siguiente es un ejemplo de fragmento de la implementación de una HAL de gadgets que admite la función UVC:

UsbGadget::setCurrentUsbFunctions(long functions) {
   ...
   // Existing functions
   if ((functions & GadgetFunction::MTP) != 0) {
       ...
       linkFunction("ffs.mtp"); // Mount to ConfigFS
       ...
   }
   ...
   // UVC function follows the same pattern!
   if ((functions & GadgetFunction::UVC) != 0) {
       ...
       linkFunction("uvc.0"); // Mount to ConfigFS
       ...
   }
   ...
}

Si el dispositivo actúa como cámara web, asegúrate de que la HAL del gadget USB muestre anuncios. las combinaciones de VID/PID adecuadas.

Debido a que toda la lógica de UVC se encuentra en el inicio del proveedor o en el DeviceAsWebcam servicio, sin una lógica específica de UVC, excepto la symlink de la función de UVC a ConfigFS, es obligatorio en la HAL del gadget.

Para obtener más orientación sobre la implementación, consulta el siguiente código de muestra en AOSP:

Establece ConfigFS con parámetros de configuración de UVC

Para informar al controlador de gadgets UVC qué formatos, tamaños y velocidades de fotogramas se compatible con la cámara web de Android, establece ConfigFS con parámetros de UVC. Para para obtener más información, consulta la documentación upstream de Linux en ConfigFS UVC ABI de gadget.

El siguiente es un ejemplo de cómo el init del proveedor puede configurar el controlador de gadgets UVC (fragmento de código en AOSP):

# uvc function
   mkdir /configfs_path/functions/uvc.0
   write /configfs_path/functions/uvc.0/function_name "Android Webcam"
   write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
   # setup control params
   mkdir /configfs_path/functions/uvc.0/control/header/h
   symlink /configfs_path/functions/uvc.0/control/header/h \
                /configfs_path/functions/uvc.0/control/class/fs/h
   symlink /configfs_path/functions/uvc.0/control/header/h \
                /configfs_path/functions/uvc.0/control/class/ss/h
   # advertise 1080p resolution for webcam encoded as mjpeg
   mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
   # advertise 30 fps support for 1080p.
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
   write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
   # setup streaming params
   mkdir /configfs_path/functions/uvc.0/streaming/header/h
   symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
                /configfs_path/functions/uvc.0/streaming/header/h/m
   symlink /configfs_path/functions/uvc.0/streaming/header/h \
                /configfs_path/functions/uvc.0/streaming/class/fs/h
   symlink /configfs_path/functions/uvc.0/streaming/header/h \
                /configfs_path/functions/uvc.0/streaming/class/hs/h
   symlink /configfs_path/functions/uvc.0/streaming/header/h \
                /config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
   # ...

Este fragmento configura el controlador de gadgets UVC para anunciar una transmisión MJPEG en 1080p en 30 fps Estas capacidades se comunican al host USB cuando realiza consultas resoluciones y velocidades de fotogramas admitidas.

Los siguientes son lineamientos generales para seleccionar la configuración de la cámara web anuncia:

  • Los dos formatos de transmisión que admite el servicio DeviceAsWebcam son MJPEG y YUYV sin comprimir.
  • El USB 2.0 admite una transferencia de datos de 480 Mbps (60 Mbps). Esta significa que, a 30 fps, cada fotograma debe tener un tamaño máximo de 2 MB. y a 60 fps, un tamaño máximo de 1 MB.
    • Transmisiones sin comprimir (YUYV): A 30 FPS, el fotograma máximo admitido es de 720p porque YUYV es de 2 bytes por píxel.
    • Transmisiones MJPEG comprimidas: suponiendo una relación de compresión de 1:10 a partir del YUV USB 2.0 puede admitir 4K (1.18 MB por marco).
  • Los dispositivos de cámara frontal y posterior principales deben admitir todos los tamaños de marcos que se anuncian. Esto se debe a que el usuario puede alternar entre los IDs de cámara usando la IU de la vista previa. Para transmisiones MJPEG, recomendamos a los proveedores anunciar 480p (640 x 480), 720p (1280 x 820) y 1080p (1920 x 1080), ya que son tamaños que suelen usar las apps host.
  • Los dispositivos de cámara frontal y posterior principales deben admitir todas las velocidades de fotogramas que se se anuncian todas las subredes. Recomendamos enfáticamente que los proveedores admitan 30 FPS.

Para ver un ejemplo de cómo agregar configuraciones de transmisión con cámara web (ConfigFS), consulta Parche de muestra de AOSP.

Habilitar la cámara web en la compilación

Para habilitar el servicio DeviceAsWebcam, debes configurar ro.usb.uvc.enabled del sistema a true en el archivo device.mk.

# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
    ro.usb.uvc.enabled=true

Cuando esta propiedad del sistema está habilitada, aparece la opción Cámara web en el Settings en las preferencias de USB, como se muestra en la Figura 3. Cuando la opción es Android, el dispositivo Android aparecerá como una cámara web USB al dispositivo host.

Figura 3: Preferencias de USB en la app de Configuración.

También puedes configurar el dispositivo para la función de cámara web USB a través de ADB con este comando :

adb shell svc usb setFunctions uvc

Ten en cuenta los problemas térmicos y de potencia

Las operaciones con la cámara web implican que la cámara de un dispositivo puede estar encendida durante varios horas al día, por lo que recomendamos tomar medidas para garantizar que la potencia el consumo y la temperatura del dispositivo se mantienen por debajo de ciertos límites. El Estas son las soluciones recomendadas para mantener el consumo de energía debajo de los límites:

  • Para obtener un mejor rendimiento de la energía de la HAL de la cámara, habilita STREAM_USE_CASE_VIDEO_CALL en el servicio DeviceAsWebcam
  • Si la alimentación es un problema incluso con STREAM_USE_CASE_VIDEO_CALL habilitado, el El servicio de DeviceAsWebcam ofrece una opción para disminuir aún más el consumo. su consumo mediante transmisiones físicas. Puedes usar superposiciones de recursos de tiempo de ejecución (RRO) para especificar a qué cámara física se debe usar. Las transmisiones físicas disminuyen significativamente la calidad del video y generan una una UX confusa, así que usa esta solución solo como último recurso. Optimizando STREAM_USE_CASE_VIDEO_CALL es la solución preferida para alimentar de seguridad en la nube. Para obtener más información sobre las RRO admitidas por DeviceAsWebcam consulta readme.md.

    El siguiente es un ejemplo de una configuración de RRO para usar el ID 3 de la cámara física. en lugar del ID de cámara lógico 0. Para ver un ejemplo en AOSP, consulta DeviceAsWebcamRaven.

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

Verificación

Para probar tu implementación del servicio DeviceAsWebcam en tu dispositivo, usa las siguientes pruebas:

  • Cámara web de prueba del verificador del CTS: Prueba que el formato, el tamaño y las velocidades de fotogramas que admite el dispositivo.
  • Pruebas manuales: Cómo probar que la función de cámara web sea compatible con varias apps de host en varios sistemas operativos host.

Problemas conocidos

Los siguientes son problemas conocidos del servicio DeviceAsWebcam: