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
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
(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 VideosIMPLEMENTATION_DEFINED
YUV12
für alle anderenIMPLEMENTATION_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.