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
, damitcameraserver
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 anderenIMPLEMENTATION_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.