Cámaras USB externas

La plataforma de Android admite el uso de cámaras USB "plug-and-play" (es decir, cámaras web) utilizando la configuración API de Camera2 de Android y la cámara HAL interfaz de usuario. Generalmente, se admiten cámaras web Clase de video USB (UVC) y en Linux, el servicio estándar Video4Linux (V4L) controlador se utiliza para controlar cámaras UVC.

Gracias a la compatibilidad con cámaras web, los dispositivos se pueden utilizar en casos de uso ligeros, como el videochat y los kioscos de fotos. Esta función no reemplaza los estándares internos HAL de la cámara en teléfonos Android y no está diseñada para admiten tareas complejas de rendimiento intensivo que requieren alta resolución y transmisión de alta velocidad, RA y control manual de ISP, sensores y lentes.

El proceso de la HAL de la cámara USB es parte del proveedor de la cámara externa que escucha la disponibilidad de dispositivos USB y enumera los dispositivos de cámara externos según corresponda. El proceso tiene permisos y una política de SE similar a la de HAL de la cámara integrada. Apps de cámara web de terceros que se comunican directamente con dispositivos USB requieren los mismos permisos de cámara para acceder a UVC al igual que con cualquier app de cámara normal.

Ejemplos y fuentes

Si deseas obtener más información para implementar cámaras USB, consulta la documentación de la cámara externa. implementación de referencia del proveedor en ExternalCameraProvider El dispositivo de cámara externa y las implementaciones de la sesión se incluyen en ExternalCameraDevice y ExternalCameraDeviceSession A partir del nivel de API 28, la API cliente de Java incluye las EXTERNAL a nivel de hardware.

Implementación

La implementación debe admitir la android.hardware.usb.host función del sistema.

También se debe habilitar la compatibilidad con kernel para dispositivos UVC. Para habilitar esta función, y agrega lo siguiente a los respectivos archivos defconfig de kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Para habilitar el proveedor de cámara externo en la compilación del dispositivo correspondiente, que agrega los permisos de SELinux necesarios, la configuración de la cámara externa y una dependencia del proveedor de cámara externo, completa los siguientes pasos:

  • Agrega el archivo de configuración de la cámara externa y la biblioteca de la cámara externa a device.mk

    +PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Agrega el nombre del proveedor de cámara externo al manifiesto de la HAL de Treble del dispositivo.

    <hal format="aidl">
        <name>android.hardware.camera.provider</name>
        <version>1</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>internal/0</instance>
    +       <instance>external/0</instance>
        </interface>
    </hal>
    
  • (Opcional) Si el dispositivo se ejecuta en el modo de transferencia de Treble, actualiza sepolicy. para que cameraserver pueda acceder a la cámara UVC.

    +# for external camera
    +allow cameraserver device:dir r_dir_perms;
    +allow cameraserver video_device:dir r_dir_perms;
    +allow cameraserver video_device:chr_file rw_file_perms;
    

Este es un ejemplo de external_camera_config.xml (se omiten las líneas de derechos de autor).

<ExternalCamera>
    <Provider>
        <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>
        </ignore>
    </Provider>
    <!-- See ExternalCameraUtils.cpp for default values of Device configurations below -->
    <Device>
        <!-- Max JPEG buffer size in bytes-->
        <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
        <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
        <!-- Larger value: more request can be cached pipeline (less janky)  -->
        <!-- Smaller value: use less memory -->
        <NumVideoBuffers count="4"/>
        <!-- Size of v4l2 buffer queue when streaming < 30fps -->
        <NumStillBuffers count="2"/>

        <!-- List of maximum fps for various output sizes -->
        <!-- Any image size smaller than the size listed in Limit row will report
            fps (as minimum frame duration) up to the fpsBound value. -->
        <FpsList>
            <!-- width/height must be increasing, fpsBound must be decreasing-->
            <Limit width="640" height="480" fpsBound="30.0"/>
            <Limit width="1280" height="720" fpsBound="15.0"/>
            <Limit width="1920" height="1080" fpsBound="10.0"/>
            <!-- image size larger than the last entry will not be supported-->
        </FpsList>
    </Device>
</ExternalCamera>

Personalización

Puedes mejorar la cámara de Android con opciones de personalización generales. o bien optimizaciones específicas para dispositivos.

Personalizaciones generales

Para personalizar el proveedor de la cámara externa, modifica el external_camera_config.xml. En concreto, los clientes pueden personalizar el los siguientes parámetros:

  • Se excluyen los nodos de video de las cámaras internas
  • Límite superior de tamaño de imagen y velocidad de fotogramas compatibles
  • Cantidad de búferes en tránsito (intercambio de bloqueos frente a memoria)

Además de estos parámetros, puedes agregar tus propios parámetros o desarrollar tu tus propias configuraciones.

Optimizaciones específicas para dispositivos

También puedes mejorar el rendimiento agregando optimizaciones específicas para cada dispositivo.

Copia y escalamiento en búfer y decodificación y codificación JPEG

Las implementaciones genéricas usan CPU (libyuv/libjpeg), pero puedes reemplazarlo por optimizaciones específicas para el dispositivo.

Formato de salida de la HAL

Las implementaciones genéricas usan los siguientes formatos de salida:

  • YUV_420_888 para búferes de video IMPLEMENTATION_DEFINED
  • YUV12 para todos los demás búferes IMPLEMENTATION_DEFINED

Para mejorar el rendimiento, puedes reemplazar los formatos de salida por formatos específicos formatos eficientes. También puedes admitir formatos adicionales en una implementación

Validación

Los dispositivos compatibles con cámaras externas deben pasar CTS de cámara. El USB externo la cámara web debe permanecer enchufada en el dispositivo específico durante toda la prueba, de lo contrario, algunos casos de prueba fallarán.