Auf Geräten mit Android 14 QPR1 oder höher kann das Gerät als USB-Webcam verwendet werden. Android-Geräte, die diese Funktion unterstützen, werden als ein UVC-Gerät beworben. Dadurch kann eine Vielzahl von USB-Hosts mit verschiedenen Betriebssystemen (z. B. Linux, macOS, Windows und ChromeOS) die Kamera des Geräts als Webcam verwenden. Der DeviceAsWebcam Dienst
unterstützt diese Funktion, um das Gerät als Webcam zu verwenden.
Dienst „DeviceAsWebcam“
Der Dienst DeviceAsWebcam in AOSP enthält eine Vorschauaktivität
(DeviceAsWebcamPreview.java), mit der Nutzer die Szene einrahmen können. Die Vorschauaktivität bietet dem Nutzer folgende Möglichkeiten:
Vorschau, wie der Webcam-Feed auf dem Hostcomputer aussehen wird, bevor das Streaming beginnt.
Anpassen des Webcam-Feeds, der an den Host gesendet wird, auf folgende Weise:
- Auswählen der Kamera für das Streaming (vorne oder hinten)
- Auswählen der Zoomstufe mit einem Schieberegler oder Schaltflächen
- Tippen auf einen bestimmten Bereich der Vorschau, um den Fokus auf einen Bereich zu legen oder zu entfernen
Die Vorschauaktivität funktioniert mit allgemeinen Bedienungshilfen unter Android wie TalkBack, Schalterzugriff und Voice Access.
Abbildung 1 : Webcam-Feed, der an einen Host gestreamt wird, wobei die Vorschau den Feed steuert.
Architektur
Die Architektur zur Unterstützung der Verwendung eines Geräts als Webcam 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 der App „Einstellungen“ die Option „USB-Webcam“ aus.
- Die App „Einstellungen“ sendet über die Klasse
UsbManagereinen Binder-Aufruf ansystem_serverund informiert sie darüber, dassFUNCTION_UVCausgewählt ist. - Der Systemserver führt folgende Schritte aus:
- Er informiert die USB-Gadget-HAL, die UVC-Gadget-Funktion über einen
setUsbFunctions-HAL-Schnittstellenaufruf abzurufen. - Er informiert die USB-Gadget-HAL, den UVC-Gadget-Treiber mit ConfigFs zu konfigurieren.
- Er informiert die USB-Gadget-HAL, die UVC-Gadget-Funktion über einen
- Nachdem
system_servereinen Callback von der Gadget-HAL erhalten hat, sendet sie eine Broadcast-Nachricht an das Framework, die vom DienstDeviceAsWebcamempfangen wird. - Der USB-Gadget-Treiber startet den Webcam-Stream, nachdem er über V4L2-Knoten unter
/dev/video*Konfigurationsbefehle vom Host erhalten hat.
Abbildung 2 : DeviceAsWebcam-Architektur.
Implementierung
In diesem Abschnitt wird beschrieben, wie Sie die Verwendung eines Android-Geräts als Webcam unterstützen.
Kernel-Unterstützung
Unter Android 14 oder höher aktiviert das Generic Kernel Image (GKI) standardmäßig den UVC-Gadget Treiber (siehe Details im AOSP-Patch).
UVC in Gadget-HAL unterstützen
Ab Android 14 ist die UVC-Funktion in der
GadgetFunction.aidl HAL-Schnittstelle enthalten. Für die Gadget-HAL wird das UVC-Gadget auf dieselbe Weise in ConfigFS eingebunden wie andere ConfigFS-Funktionen wie MTP oder ADB.
Um die Gadget-HAL zu implementieren, müssen Sie Änderungen vornehmen, um die UVC-Funktion in ConfigFS einzubinden. Hier ist ein Beispiel-Snippet einer Gadget-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, muss die USB-Gadget-HAL die richtigen VID/PID-Kombinationen bewerben.
Da sich die gesamte UVC-Logik entweder in der Anbieterinitialisierung oder im Dienst DeviceAsWebcam befindet, ist in der Gadget-HAL keine UVC-spezifische Logik erforderlich, außer der symbolischen Verknüpfung der UVC-Funktion mit ConfigFS.
Weitere Informationen zur Implementierung finden Sie im folgenden Beispielcode in AOSP:
ConfigFS mit UVC-Konfigurationen einrichten
Um den UVC-Gadget-Treiber darüber zu informieren, welche Formate, Größen und Bildraten von der Android-Webcam unterstützt werden, richten Sie ConfigFS mit UVC-Konfigurationen ein. Weitere Informationen finden Sie in der Upstream-Linux-Dokumentation zum ConfigFS UVC Gadget-ABI.
Hier ist ein Beispiel dafür, wie die Anbieterinitialisierung 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
# ...
Dieses Snippet richtet den UVC-Gadget-Treiber so ein, dass ein 1080p-MJPEG-Stream mit 30 fps beworben wird. Diese Funktionen werden dem USB-Host mitgeteilt, wenn er unterstützte Auflösungen und Bildraten abfragt.
Im Folgenden finden Sie allgemeine Richtlinien für die Auswahl der Konfigurationen, die von der Webcam beworben werden:
- Die beiden vom Dienst
DeviceAsWebcamunterstützten Streamformate sind MJPEG und unkomprimiertes YUYV. - USB 2.0 unterstützt die Übertragung von Daten mit 480 Mbit/s (60 MB/s). Das bedeutet, dass bei 30 fps jeder Frame eine maximale Größe von 2 MB und bei 60 fps eine maximale Größe von 1 MB haben darf.
- Unkomprimierte Streams (YUYV): Bei 30 fps beträgt die maximal unterstützte Framegröße 720p, da YUYV 2 Byte pro Pixel verwendet.
- Komprimierte MJPEG-Streams: Bei einem Komprimierungsverhältnis von 1:10 von YUV kann USB 2.0 4K unterstützen (1,18 MB pro Frame).
- Die primären Geräte für die vordere und hintere Kamera müssen alle beworbenen Framegrößen unterstützen. Das liegt daran, dass der Nutzer über die Vorschau-UI zwischen den Kamera-IDs wechseln kann. Für MJPEG-Streams empfehlen wir Anbietern, die Framegrößen 480p (640 × 480), 720p (1280 × 820) und 1080p (1920 × 1080) zu bewerben, da diese Größen häufig von Host-Apps verwendet werden.
- Die primären Geräte für die vordere und hintere Kamera müssen alle beworbenen Bildraten unterstützen. Wir empfehlen Anbietern dringend, 30 fps zu unterstützen.
Ein Beispiel für das Hinzufügen von Webcam-Streamkonfigurationen (ConfigFS) finden Sie unter AOSP-Beispielpatch.
Webcam im Build aktivieren
Wenn Sie den DeviceAsWebcam Dienst aktivieren möchten, müssen Sie die ro.usb.uvc.enabled
Systemeigenschaft in der true Datei auf device.mk setzen.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Wenn diese Systemeigenschaft aktiviert ist, wird in der App „Einstellungen“ unter den 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 der App „Einstellungen“.
Sie können das Gerät auch über ADB auf die USB-Webcam-Funktion einstellen. Verwenden Sie dazu diesen Befehl:
adb shell svc usb setFunctions uvcStromverbrauch und Wärmeentwicklung berücksichtigen
Wenn die Webcam verwendet wird, kann die Kamera eines Geräts mehrere Stunden pro Tag eingeschaltet sein. Wir empfehlen daher, Maßnahmen zu ergreifen, um sicherzustellen, dass der Stromverbrauch und die Wärmeentwicklung des Geräts bestimmte Grenzwerte nicht überschreiten. Im Folgenden finden Sie empfohlene Lösungen, um den Stromverbrauch unter den Grenzwerten zu halten:
- Um die Stromleistung der Kamera-HAL zu verbessern, aktivieren Sie
STREAM_USE_CASE_VIDEO_CALLim DienstDeviceAsWebcam. Wenn der Stromverbrauch auch bei aktivierter Option
STREAM_USE_CASE_VIDEO_CALLein Problem darstellt, bietet der DienstDeviceAsWebcameine Option, den Stromverbrauch durch die Verwendung physischer Streams weiter zu senken. Sie können Laufzeit-Ressourcen-Overlays (RROs) verwenden, um anzugeben, welche physische Kamera verwendet werden soll. Physische Streams führen zu einer erheblichen Verschlechterung der Videoqualität und zu einer verwirrenden Nutzererfahrung. Verwenden Sie diese Lösung daher nur als letztes Mittel. Die Optimierung vonSTREAM_USE_CASE_VIDEO_CALList die bevorzugte Lösung für Stromverbrauchsprobleme. Weitere Informationen zu den vomDeviceAsWebcamDienst unterstützten RROs finden Sie in der Datei „readme.md“.Hier ist ein Beispiel für ein RRO, das so eingerichtet ist, dass die physische Kamera-ID 3 anstelle der logischen Kamera-ID 0 verwendet wird. Ein Beispiel in AOSP finden Sie unter DeviceAsWebcamRaven.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Bestätigung
Verwenden Sie die folgenden Tests, um die Implementierung des Dienstes DeviceAsWebcam auf Ihrem Gerät zu testen:
- CTS-Verifier-Test „Webcam“: Testen Sie, ob Formate, Größen und Bildraten 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
Im Folgenden finden Sie bekannte Probleme für den Dienst DeviceAsWebcam:
Der Stream des UVC-Gadget-Treibers flackert manchmal und zeigt scheinbar beschädigte Frames. Dieses Problem wurde behoben und upstream und in GKI zusammengeführt.
Android-Geräte im Webcam-Modus funktionieren aufgrund eines Fehlers im UVC-Treiber von Apple nicht mit USB 3.0+-Kabeln auf macOS-Hosts.