Externe USB-Kameras

Die Android-Plattform unterstützt die Verwendung von Plug-and-Play-USB-Kameras (d. h. Webcams) mithilfe des Standards Android Camera2 API und die Kamera HAL . Webcams unterstützen in der Regel USB-Videoklasse (UVC) und unter Linux die Standard- Video4Linux (V4L) wird verwendet, um UVC-Kameras zu steuern.

Dank der Unterstützung von Webcams können die Geräte auch in schlanken Anwendungsfällen verwendet werden, z. B. Videochats und Fotokioske. Diese Funktion ersetzt keine Kamera-HALs von Android-Smartphones verwendet und nicht leistungsintensive, komplexe Aufgaben wie hochauflösende Highspeed-Streaming, AR und manuelle Steuerung von Internetanbietern, Sensoren und Objektiven.

Der HAL-Prozess für USB-Kameras ist Teil des externen Kameraanbieters, der erfasst die Verfügbarkeit von USB-Geräten und listet externe Kamerageräte auf entsprechend anpassen. Der Prozess verfügt über Berechtigungen und eine SE-Richtlinie ähnlich der Kamera-HAL-Prozess. Webcam-Apps von Drittanbietern, die miteinander kommunizieren direkt über USB-Geräte einrichten, benötigen für den Zugriff auf UVC dieselben Kameraberechtigungen wie bei jeder herkömmlichen Kamera-App.

Beispiele und Quellen

Weitere Informationen zur Implementierung von USB-Kameras finden Sie auf der Seite zur externen Kamera Implementierung der Referenz des Anbieters ExternalCameraProvider Die Implementierung externer Kamerageräte und -sitzungen ist in ExternalCameraDevice und ExternalCameraDeviceSession Ab API-Level 28 enthält die Java-Client-API den EXTERNAL Hardwareebene.

Implementierung

Die Implementierung muss den android.hardware.usb.host Systemfunktion.

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

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Um den externen Kameraanbieter im entsprechenden Geräte-Build zu aktivieren, fügt die erforderlichen SELinux-Berechtigungen, die Konfiguration der externen Kamera und wenn Sie einen externen Kameraanbieter verwenden möchten, führen Sie die folgenden Schritte aus:

  • Fügen Sie die Konfigurationsdatei für die externe Kamera und die Bibliothek für die externe Kamera hinzu. 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
    
  • Fügen Sie den Namen des externen Kameraanbieters dem 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 Höhen-Passthrough-Modus ausgeführt wird, aktualisiere 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 (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 durch allgemeine Anpassungsoptionen optimieren. oder gerätespezifische Optimierungen.

Allgemeine Anpassungen

Sie können den externen Kameraanbieter anpassen, indem Sie die external_camera_config.xml-Datei. Insbesondere können Kunden die folgende Parameter:

  • Videoknoten interner Kameras ausschließen
  • Unterstützte Bildgröße und Framerate-Obergrenze
  • Anzahl der Zwischenspeicher im laufenden Betrieb (Rang im Vergleich zum Arbeitsspeicher-Kompromiss)

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

Gerätespezifische Optimierungen

Sie können die Leistung auch verbessern, indem Sie gerätespezifische Optimierungen hinzufügen.

Zwischenspeichern kopieren/skalieren und JPEG-Decodierung/Codierung

Generische Implementierungen verwenden die CPU (libyuv/libjpeg), aber Sie können dies ersetzen durch gerätespezifische Optimierungen vornehmen.

HAL-Ausgabeformat

Bei generischen Implementierungen werden die folgenden Ausgabeformate verwendet:

  • YUV_420_888 für Zwischenspeicher des Videos IMPLEMENTATION_DEFINED
  • YUV12 für alle anderen IMPLEMENTATION_DEFINED-Zwischenspeicher

Zur Verbesserung der Leistung können Sie Ausgabeformate durch gerätespezifische Formate ersetzen. effiziente Formate zu entwickeln. Sie können auch zusätzliche Formate in einem benutzerdefinierten Implementierung

Zertifizierungsstufe

Geräte mit Unterstützung für externe Kameras müssen CTS der Kamera. Externes USB-Kabel Die Webcam muss während des gesamten Testlaufs am jeweiligen Gerät angeschlossen bleiben. Andernfalls schlagen einige Testläufe fehl.