Bei Geräten mit Android 14-QPR1 oder höher unterstützt Android die Verwendung des Geräts als USB-Webcam. Android-Geräte, die diese Funktion unterstützen, werden als UVC-Gerät beworben, sodass eine Vielzahl von USB-Hosts mit verschiedenen Betriebssystemen (z. B. Linux, macOS, Windows und ChromeOS) die Kamera des Geräts als Webcam verwenden kann. Der Dienst DeviceAsWebcam
unterstützt diese Funktion, um das Gerät als Webcam zu verwenden.
DeviceAsWebcam-Dienst
Der DeviceAsWebcam
-Dienst in AOSP enthält eine Vorschauaktivität (DeviceAsWebcamPreview.java
), mit der Nutzer den Rahmen für die Szene erstellen können. Mit der Vorschauaktivität kann der Nutzer Folgendes tun:
Sehen Sie sich vor Beginn des Streamings eine Vorschau an, wie der Webcam-Feed auf dem Hostcomputer aussehen wird.
Passen Sie den an den Host gesendeten Webcam-Feed folgendermaßen an:
- Die Auswahl der zu streamenden Kamera (Vorder- oder Rückansicht)
- Auswählen der Zoomstufe mithilfe eines Schiebereglers oder mithilfe von Schaltflächen.
- Tippen Sie auf einen bestimmten Bereich in der Vorschau, um den Fokus darauf zu verschieben oder ihn zu entfernen.
Die Vorschauaktivität funktioniert mit allgemeinen Bedienungshilfen unter Android wie TalkBack, Schalterzugriff und Voice Access.
Abbildung 1: Der Webcam-Feed wird an einen Host gestreamt, dessen Feed von der Vorschau gesteuert wird.
Architektur
Die Architektur, die die Verwendung eines Geräts als Webcam unterstützen soll, ist in Abbildung 2 dargestellt. Im Folgenden wird der Interaktionsablauf des Dienstes DeviceAsWebcam
mit dem Rest des Android-Frameworks beschrieben:
- Der Nutzer wählt in den Einstellungen die USB-Webcam-Option aus.
- Die App „Einstellungen“ sendet einen Binder-Aufruf über die Klasse
UsbManager
ansystem_server
und gibt an, dassFUNCTION_UVC
ausgewählt ist. - Der Systemserver führt Folgendes aus:
- Informiert den USB-Gadget-HAL, die UVC-Gadget-Funktion über einen
setUsbFunctions
HAL-Schnittstellenaufruf abzurufen. - Informiert den USB-Gadget-HAL, den UVC-Gadget-Treiber mithilfe von ConfigFs zu konfigurieren.
- Informiert den USB-Gadget-HAL, die UVC-Gadget-Funktion über einen
- Nach dem Empfang eines Callbacks vom HAL des Gadgets sendet
system_server
eine Broadcast-Nachricht an das Framework, die vomDeviceAsWebcam
-Dienst abgerufen werden soll. - Der USB-Gadget-Treiber startet den Webcam-Stream, nachdem er Konfigurationsbefehle vom Host über V4L2-Knoten unter
/dev/video*
erhält.
Abbildung 2: DeviceAsWebcam-Architektur.
Implementierung
In diesem Abschnitt wird beschrieben, wie Sie ein Android-Gerät als Webcam verwenden können.
Kernel-Unterstützung
Bei Android 14 oder höher aktiviert das generische Kernel-Image (GKI) standardmäßig den UVC-Gadget-Treiber (weitere Informationen unter AOSP-Patch).
UVC in Gadget HAL unterstützen
Ab Android 14 ist die UVC-Funktion in der HAL-Schnittstelle GadgetFunction.aidl
enthalten. Für den Gadgets-HAL wird das UVC-Gadget auf die gleiche Weise in ConfigFS wie andere ConfigFS-Funktionen wie MTP oder ADB bereitgestellt.
Nehmen Sie Änderungen vor, um die UVC-Funktion für ConfigFS bereitzustellen, um das HAL des Gadgets zu implementieren. Im Folgenden sehen Sie ein Beispiel-Snippet einer Gadgets-HAL-Implementierung, die die UVC-Funktion unterstützt:
UsbGadget::setCurrentUsbFunctions(long functions) {
...
// Existing functions
if ((functions & GadgetFunction::MTP) != 0) {
...
linkFunction("ffs.mtp"); // Mount to ConfigFS
...
}
...
// UVC function follows the same pattern!
if ((functions & GadgetFunction::UVC) != 0) {
...
linkFunction("uvc.0"); // Mount to ConfigFS
...
}
...
}
Wenn das Gerät als Webcam fungiert, achten Sie darauf, dass der HAL des USB-Gadgets die richtigen VID/PID-Kombinationen bewirbt.
Da sich die gesamte UVC-Logik entweder in der Anbieter-Instanzi oder im DeviceAsWebcam
-Dienst befindet, ist im Gadgets-HAL keine UVC-spezifische Logik erforderlich, außer der Symlinkierung der UVC-Funktion mit ConfigFS.
Weitere Anleitungen zur Implementierung finden Sie im folgenden Beispielcode in AOSP:
ConfigFS mit UVC-Konfigurationen einrichten
Richten Sie ConfigFS mit UVC-Konfigurationen ein, um dem UVC-Gadget-Treiber mitzuteilen, welche Formate, Größen und Framerates von der Android-Webcam unterstützt werden. Weitere Informationen finden Sie in der Upstream-Linux-Dokumentation im ConfigFS UVC-Gadget ABI.
Das folgende Beispiel zeigt, wie die Anbieter-Init den UVC-Gadget-Treiber einrichten kann (Code-Snippet in AOSP):
# uvc function
mkdir /configfs_path/functions/uvc.0
write /configfs_path/functions/uvc.0/function_name "Android Webcam"
write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
# setup control params
mkdir /configfs_path/functions/uvc.0/control/header/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/fs/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/ss/h
# advertise 1080p resolution for webcam encoded as mjpeg
mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
# advertise 30 fps support for 1080p.
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
# setup streaming params
mkdir /configfs_path/functions/uvc.0/streaming/header/h
symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
/configfs_path/functions/uvc.0/streaming/header/h/m
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/fs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/hs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
# ...
Mit diesem Snippet wird der UVC-Gadget-Treiber so eingerichtet, dass ein 1080p-MJPEG-Stream mit 30 fps beworben wird. Diese Funktionen werden an den USB-Host übermittelt, wenn er unterstützte Auflösungen und Framerates abfragt.
Im Folgenden finden Sie allgemeine Richtlinien für die Auswahl der Konfigurationen, die von der Webcam beworben werden:
- Die beiden vom
DeviceAsWebcam
-Dienst unterstützten Streamformate sind MJPEG und unkomprimiertes YUYV. - USB 2.0 unterstützt die Datenübertragung mit 480 Mbit/s (60 Mbit/s). Das bedeutet, dass jeder Frame bei 30 fps eine maximale Größe von 2 MB und bei 60 fps eine maximale Größe von 1 MB haben muss.
- Unkomprimierte Streams (YUYV): Bei 30 fps beträgt die maximal unterstützte Framegröße 720p, da YUYV 2 Byte pro Pixel beträgt.
- Komprimierte MJPEG-Streams: Bei einem Komprimierungsverhältnis von 1:10 von YUV unterstützt USB 2.0 4K (1,18 MB pro Frame).
- Primäre Front- und Rückkameras müssen alle angebotenen Frame-Größen unterstützen. Das liegt daran, dass der Nutzer über die Vorschau-Benutzeroberfläche zwischen Kamera-IDs wechseln kann. Für MJPEG-Streams empfehlen wir Anbietern, die Frame-Größen 480p (640 x 480), 720p (1280 x 820) und 1080p (1920 x 1080) zu bewerben, da diese Größen üblicherweise von Host-Apps verwendet werden.
- Primäre Front- und Rückkameras müssen alle beworbenen Framerates unterstützen. Wir empfehlen den Anbietern dringend, 30 fps zu unterstützen.
Ein Beispiel für das Hinzufügen von Webcam-Streamkonfigurationen (ConfigFS) findest du unter AOSP-Beispielpatch.
Webcam im Build aktivieren
Zum Aktivieren des Dienstes DeviceAsWebcam
müssen Sie das Systemattribut ro.usb.uvc.enabled
in der Datei device.mk
auf true
setzen.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Wenn diese Systemeigenschaft aktiviert ist, wird in der App „Einstellungen“ unter „USB-Einstellungen“ die Option Webcam angezeigt (siehe Abbildung 3). Wenn die Option ausgewählt ist, wird das Android-Gerät dem Hostgerät als USB-Webcam angezeigt.
Abbildung 3: USB-Einstellungen in den Einstellungen.
Sie können das Gerät mit diesem Befehl auch über ADB auf die USB-Webcam-Funktion einstellen:
adb shell svc usb setFunctions uvc
Bedenken hinsichtlich Stromversorgung und Überhitzung berücksichtigen
Bei Webcam-Betrieb kann die Kamera eines Geräts mehrere Stunden am Tag eingeschaltet sein. Daher empfehlen wir, Maßnahmen zu ergreifen, um sicherzustellen, dass der Stromverbrauch und die Überhitzung des Geräts unter bestimmten Grenzwerten bleiben. Im Folgenden finden Sie empfohlene Lösungen, um den Stromverbrauch innerhalb von Grenzwerten zu halten:
- Aktivieren Sie
STREAM_USE_CASE_VIDEO_CALL
imDeviceAsWebcam
-Dienst, um die Leistung des Kamera-HAL zu verbessern. Wenn die Stromversorgung auch bei aktiviertem
STREAM_USE_CASE_VIDEO_CALL
ein Problem darstellt, bietet der DienstDeviceAsWebcam
eine Option zur weiteren Verringerung des Stromverbrauchs durch die Nutzung physischer Streams. Mit Laufzeitressourcen-Overlays (RROs) können Sie angeben, welche physische Kamera verwendet werden soll. Physische Streams verringern die Videoqualität erheblich und führen zu einer verwirrenden Nutzererfahrung. Daher sollte diese Lösung nur als letztes Mittel eingesetzt werden. Das Optimieren vonSTREAM_USE_CASE_VIDEO_CALL
ist die bevorzugte Lösung, um Bedenken auszuräumen. Weitere Informationen zu vom DienstDeviceAsWebcam
unterstützten RROs finden Sie unter readme.md.Das folgende Beispiel zeigt eine RRO, die so eingerichtet ist, dass die physische Kamera-ID 3 anstelle der logischen Kamera-ID 0 verwendet wird. Ein Beispiel für AOSP finden Sie unter DeviceAsWebcamRaven.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Bestätigung
Mit den folgenden Tests kannst du die Implementierung des Dienstes DeviceAsWebcam
auf deinem Gerät testen:
- Test der Webcam des CTS-Verifizierers: Teste, ob Formate, Größen und Framerates vom Gerät unterstützt werden.
- Manuelle Tests: Testen Sie, ob die Webcam-Funktion mit verschiedenen Host-Apps auf verschiedenen Host-Betriebssystemen funktioniert.
Bekannte Probleme
Die folgenden Probleme sind beim Dienst DeviceAsWebcam
bekannt:
Der Stream des UVC-Gadget-Treibers flackert manchmal und zeigt so an, wie beschädigte Frames aussehen. Dieses Problem wurde behoben und vorgelagert und in GKI zusammengeführt.
Android-Geräte im Webcam-Modus funktionieren aufgrund eines Fehlers im UVC-Treiber von Apple nicht mit Kabeln von USB 3.0 oder höher auf macOS-Hosts.