Externe USB-Kameras

Die Android-Plattform unterstützt die Verwendung von Plug-and-Play-USB-Kameras (d. h. Webcams) unter Verwendung der Standard -Android-Camera2-API und der Kamera- HAL- Schnittstelle. Webcams unterstützen im Allgemeinen USB-Videoklasse-Treiber (UVC) , und unter Linux wird der Standard- Video4Linux-Treiber (V4L) zur Steuerung von UVC-Kameras verwendet.

Durch die Unterstützung von Webcams können Geräte in einfachen Anwendungsfällen wie Video-Chats und Fotokiosken verwendet werden. Diese Funktion ersetzt nicht typische interne Kamera-HALs auf Android-Telefonen und ist nicht für die Unterstützung leistungsintensiver, komplexer Aufgaben wie hochauflösendes und schnelles Streaming, AR und manuelle ISP-/Sensor-/Objektivsteuerung konzipiert.

Der USB-Kamera-HAL-Prozess ist Teil des externen Kameraanbieters, der die Verfügbarkeit von USB-Geräten überwacht und externe Kamerageräte entsprechend auflistet. Der Prozess verfügt über Berechtigungen und eine SE-Richtlinie ähnlich dem integrierten Kamera-HAL-Prozess. 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 normale Kamera-App.

Beispiele und Quellen

Weitere Informationen zum Implementieren von USB-Kameras finden Sie in der Referenzimplementierung für externe Kameraanbieter unter ExternalCameraProvider . Die externen Kamerageräte- und Sitzungsimplementierungen sind in ExternalCameraDevice und ExternalCameraDeviceSession enthalten. Ab API-Ebene 28 umfasst die Java-Client-API die Hardwareebene EXTERNAL .

Implementierung

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

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

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Führen Sie die folgenden Schritte aus, um den externen Kameraanbieter im jeweiligen Geräte-Build zu aktivieren, der die erforderlichen SELinux-Berechtigungen, die Konfiguration der externen Kamera und die Abhängigkeit vom externen Kameraanbieter hinzufügt:

  • Fügen Sie die externe Kamerakonfigurationsdatei und die externe Kamerabibliothek zu device.mk 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 den Namen des externen Kameraanbieters zum Treble-HAL-Manifest des Geräts 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 läuft, 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 ist ein Beispiel für external_camera_config.xml (Copyright-Zeilen weggelassen).

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

Anpassung

Sie können die Android-Kamera entweder durch allgemeine Anpassungsmöglichkeiten oder gerätespezifische Optimierungen erweitern.

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:

  • Ohne Videoknoten interner Kameras
  • Unterstützte Obergrenze für Bildgröße und Bildrate
  • Anzahl der Inflight-Puffer (Kompromiss zwischen Jank und Speicher)

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 verbessern, indem Sie gerätespezifische Optimierungen hinzufügen.

Pufferkopie/-skalierung und JPEG-Dekodierung/-kodierung

Generische Implementierungen nutzen CPU (libyuv/libjpeg), Sie können diese jedoch durch gerätespezifische Optimierungen ersetzen.

HAL-Ausgabeformat

Generische Implementierungen verwenden die folgenden Ausgabeformate:

  • YUV_420_888 für Video- IMPLEMENTATION_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. Sie können auch zusätzliche Formate in einer angepassten Implementierung unterstützen

Validierung

Geräte mit externer Kameraunterstützung müssen den Kamera-CTS bestehen. Die externe USB-Webcam muss während des gesamten Testlaufs am jeweiligen Gerät angeschlossen bleiben, da sonst einige Testfälle fehlschlagen.