Externe USB-Kameras

Die Android-Plattform unterstützt die Verwendung von Plug-and-Play-USB-Kameras (d. h. Webcams) mit der standardmäßigen Android Camera2 API und der HAL-Schnittstelle der Kamera. Webcams unterstützen in der Regel UVC-Treiber (USB Video Class). Unter Linux wird der Standardtreiber Video4Linux (V4L) zur Steuerung von UVC-Kameras verwendet.

Durch die Unterstützung von Webcams können Geräte für einfache Anwendungsfälle wie Videochats und Fotokioske verwendet werden. Diese Funktion ersetzt nicht die üblichen internen HALs für Kameras auf Android-Smartphones und ist nicht für leistungsintensive, komplexe Aufgaben wie hochauflösendes und schnelles Streaming, AR und manuelle ISP-/Sensor-/Objektivsteuerung vorgesehen.

Der HAL-Prozess der USB-Kamera ist Teil des externen Kameraanbieters, der die Verfügbarkeit von USB-Geräten überwacht und externe Kamerageräte entsprechend auflistet. Der Prozess hat Berechtigungen und eine SE-Richtlinie, die dem integrierten HAL-Prozess der Kamera ähnelt. Webcam-Apps von Drittanbietern, die direkt mit USB-Geräten kommunizieren, benötigen für den Zugriff auf UVC-Geräte dieselben Kameraberechtigungen wie jede andere normale Kamera-App.

Beispiele und Quellen

Weitere Informationen zur Implementierung von USB-Kameras finden Sie in der Referenzimplementierung des externen Kameraanbieters unter ExternalCameraProvider. Die Implementierungen für externe Kameras und Sitzungen sind in ExternalCameraDevice und ExternalCameraDeviceSession enthalten. Ab API-Level 28 enthält die Java-Client API die Hardwareebene EXTERNAL.

Implementierung

Die Implementierung muss die Systemfunktion android.hardware.usb.host unterstützen.

Außerdem muss die Kernelunterstützung für UVC-Geräte aktiviert sein. Sie können dies aktivieren, indem Sie den entsprechenden Kernel-defconfig-Dateien Folgendes hinzufügen:

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Führen Sie die folgenden Schritte aus, um den externen Kameraanbieter in der jeweiligen Geräteversion zu aktivieren. Dadurch werden die erforderlichen SELinux-Berechtigungen, die externe Kamerakonfiguration und die Abhängigkeit vom externen Kameraanbieter hinzugefügt:

  • Fügen Sie device.mk die Konfigurationsdatei und die Bibliothek der externen Kamera hinzu.

    +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
    
  • Fügen Sie dem Treble HAL-Manifest des Geräts den Namen des externen Kameraanbieters hinzu.

    <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>
    
  • Optional: Wenn das Gerät im Treble-Passthrough-Modus ausgeführt wird, aktualisieren Sie sepolicy, damit cameraserver auf die UVC-Kamera zugreifen kann.

    +# 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;
    

Hier ein Beispiel für external_camera_config.xml (Urheberrechtszeilen ausgelassen).

<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>

Personalisierung

Sie können die Android-Kamera entweder über allgemeine Anpassungsoptionen oder über gerätespezifische Optimierungen verbessern.

Allgemeine Anpassungen

Sie können den externen Kameraanbieter anpassen, indem Sie die Datei external_camera_config.xml ändern. Insbesondere können Kunden die folgenden Parameter anpassen:

  • Videoknoten von Innenkameras ausschließen
  • Obergrenze für unterstützte Bildgröße und Framerate
  • Anzahl der In-Flight-Buffer (Kompromiss zwischen Ruckeln und Arbeitsspeicher)

Zusätzlich zu diesen Parametern können Sie eigene Parameter hinzufügen oder eigene Konfigurationen entwickeln.

Gerätespezifische Optimierungen

Sie können die Leistung auch durch gerätespezifische Optimierungen verbessern.

Zwischenspeicher-Kopie/-Skalierung und JPEG-Dekodierung/-Codierung

Für die generischen Implementierungen wird die CPU (libyuv/libjpeg) verwendet. Sie können diese jedoch durch gerätespezifische Optimierungen ersetzen.

HAL-Ausgabeformat

Für generische Implementierungen werden die folgenden Ausgabeformate verwendet:

  • YUV_420_888 für VideoIMPLEMENTATION_DEFINED-Puffer
  • YUV12 für alle anderen IMPLEMENTATION_DEFINED-Puffer

Um die Leistung zu verbessern, können Sie Ausgabeformate durch gerätespezifische, effiziente Formate ersetzen. In einer benutzerdefinierten Implementierung können Sie auch zusätzliche Formate unterstützen.

Zertifizierungsstufe

Geräte mit Unterstützung für externe Kameras müssen den Camera CTS bestehen. Die externe USB-Webcam muss während des gesamten Testlaufs an das jeweilige Gerät angeschlossen bleiben, da sonst einige Testfälle fehlschlagen.