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
, 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 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
-PufferYUV12
für alle anderenIMPLEMENTATION_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.