Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
Die Android-Plattform unterstützt die Verwendung von Plug-and-Play-USB-Kameras (also Webcams) über die standardmäßige Android Camera2 API und die HAL-Schnittstelle der Kamera. Webcams unterstützen in der Regel UVC-Treiber (USB Video Class). Unter Linux wird der Standardtreiber Video4Linux (V4L) verwendet, um UVC-Kameras zu steuern.
Dank der Unterstützung für Webcams können Geräte für einfache Anwendungsfälle wie Videoanrufe und Fotokioske verwendet werden. Diese Funktion ersetzt nicht die typischen internen Kamera-HALs auf Android-Smartphones und ist nicht für leistungsintensive, komplexe Aufgaben wie hohe Auflösung und schnelles Streaming, AR und manuelle ISP-/Sensor-/Objektivsteuerung konzipiert.
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 Kamera-HAL-Prozess ähneln. Webcam-Apps von Drittanbietern, die direkt mit USB-Geräten kommunizieren, benötigen dieselben Berechtigungen zum Zugriff auf die Kamera für den Zugriff auf UVC-Geräte wie jede normale Kamera-App.
Beispiele und Quellen
Weitere Informationen zur Implementierung von USB-Kameras findest du in der Referenzimplementierung für externe Kameraanbieter unter ExternalCameraProvider.
Die Implementierungen für externe Kamerageräte und Sitzungen sind in ExternalCameraDevice und ExternalCameraDeviceSession enthalten.
Ab API-Level 28 enthält die Java-Client-API die Hardwarestufe EXTERNAL.
Implementierung
Die Implementierung muss die Systemfunktion android.hardware.usb.host unterstützen.
Die Kernel-Unterstützung für UVC-Geräte muss ebenfalls aktiviert sein. Sie können dies aktivieren, indem Sie den entsprechenden defconfig-Kerneldateien Folgendes hinzufügen.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
So aktivierst du den externen Kameraanbieter im jeweiligen Geräte-Build, wodurch die erforderlichen SELinux-Berechtigungen, die Konfiguration der externen Kamera und die Abhängigkeit vom externen Kameraanbieter hinzugefügt werden:
Füge die Konfigurationsdatei und die Bibliothek für die externe Kamera zu
device.mkhinzu.+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.xmlFüge 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>Binde die AIDL-Kameraanbieterinstanz
external/0in dersepolicy/service_contexts-Datei des Geräts anhal_camera_service. Weitere Informationen findest du unter SEPolicy für AIDL-HALs.android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0(Optional) Wenn das Gerät im Treble-Passthrough-Modus ausgeführt wird, aktualisiere
sepolicy, damitcameraserverauf 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 (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
Du kannst die Android-Kamera entweder über allgemeine Anpassungsoptionen oder gerätespezifische Optimierungen verbessern.
Allgemeine Anpassungen
Du kannst den externen Kameraanbieter anpassen, indem du die Datei external_camera_config.xml änderst. Insbesondere können Clients die folgenden Parameter anpassen:
- Ohne Videoknoten von internen Kameras
- Unterstützte Bildgröße und Obergrenze für die Framerate
- Anzahl der Inflight-Zwischenspeicher (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.
Pufferkopie/-skalierung und JPEG-Decodierung/-Codierung
Generische Implementierungen verwenden die CPU (libyuv/libjpeg). Sie können dies jedoch durch gerätespezifische Optimierungen ersetzen.
HAL-Ausgabeformat
Generische Implementierungen verwenden die folgenden Ausgabeformate:
YUV_420_888für Video-IMPLEMENTATION_DEFINED-PufferYUV12für alle anderenIMPLEMENTATION_DEFINED-Puffer
Zur Verbesserung der Leistung können Sie Ausgabeformate durch gerätespezifische effiziente Formate ersetzen. In einer benutzerdefinierten Implementierung können Sie auch zusätzliche Formate unterstützen.
Validierung
Geräte mit Unterstützung für externe Kameras müssen den CTS für Kameras bestehen. Die externe USB-Webcam muss während des gesamten Testlaufs mit dem jeweiligen Gerät verbunden bleiben, da sonst einige Testläufe fehlschlagen.