Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. Eine Kopie der Lizenz erhalten Sie unter
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 (d. h. Webcams) über die standardmäßige Android Camera2 API und die HAL-Schnittstelle (Hardware Abstraction Layer) der Kamera. Webcams unterstützen in der Regel USB Video Class (UVC)-Treiber. Unter Linux wird der Standardtreiber Video4Linux (V4L) verwendet, um UVC-Kameras zu steuern.
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 typischen internen Kamera-HALs auf Android-Smartphones und ist nicht für leistungsintensive, komplexe Aufgaben wie hochauflösende und schnelle Streams, AR und die manuelle Steuerung von ISP, Sensor und Objektiv konzipiert.
Der USB-Kamera-HAL-Prozess ist Teil des externen Kameraanbieters, der auf die Verfügbarkeit von USB-Geräten wartet 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 für den Zugriff auf UVC-Geräte dieselben Kameraberechtigungen wie jede andere 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 das externe Kameragerät und die Sitzung sind in
ExternalCameraDevice
und
ExternalCameraDeviceSession
enthalten.
Ab API-Level 28 enthält die Java-Client-API das Hardware-Level EXTERNAL
.
Implementierung
Die Implementierung muss die Systemfunktion android.hardware.usb.host
unterstützen.
Die Kernelunterstützung für UVC-Geräte muss ebenfalls 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
So aktivieren Sie den externen Kameraanbieter im jeweiligen Geräte-Build, wodurch die erforderlichen SELinux-Berechtigungen, die Konfiguration der externen Kamera und die Abhängigkeit des externen Kameraanbieters hinzugefügt werden:
Fügen Sie die Konfigurationsdatei und die Bibliothek der externen Kamera 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 dem Geräte-Treble-HAL-Manifest 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 wurden 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 gerätespezifische Optimierungen verbessern.
Allgemeine Anpassungen
Sie können den externen Kameraanbieter anpassen, indem Sie die Datei external_camera_config.xml
ändern. Konkret können Kunden die folgenden Parameter anpassen:
- Video-Nodes von Innenkameras ausschließen
- Obergrenze für unterstützte Bildgröße und Framerate
- Anzahl der Puffer während der Ausführung (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 verbessern, indem Sie gerätespezifische Optimierungen hinzufügen.
Pufferkopie/-skalierung und JPEG-Decodierung/-Codierung
Bei generischen Implementierungen wird die CPU verwendet (libyuv/libjpeg). Sie können dies jedoch durch gerätespezifische Optimierungen ersetzen.
HAL-Ausgabeformat
Bei generischen Implementierungen werden die folgenden Ausgabeformate verwendet:
YUV_420_888
für VideopufferIMPLEMENTATION_DEFINED
YUV12
für alle anderenIMPLEMENTATION_DEFINED
-Puffer
Um die Leistung zu verbessern, können Sie Ausgabedateiformate 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 Testläufe fehlschlagen.