Bei Geräten mit Android 14-QPR1 oder höher wird die Verwendung der
Gerät als USB-Webcam an. Android-Geräte, die diese Funktion unterstützen, werden beworben.
als UVC-Gerät, das viele USB-Hosts mit unterschiedlichen
Betriebssysteme (z. B. Linux, macOS, Windows und ChromeOS) verwenden den
Kamera Ihres Geräts als Webcam verwenden. DeviceAsWebcam
-Dienst
unterstützt diese Funktion, um das Gerät als Webcam zu verwenden.
DeviceAsWebcam-Dienst
Der Dienst DeviceAsWebcam
in AOSP enthält eine Vorschauaktivität
(DeviceAsWebcamPreview.java
), mit der Nutzer die Szene einfangen können. Vorschau
Mit activity können Nutzende Folgendes tun:
Vorschau des Webcam-Feeds auf dem Hostcomputer vor dem Streaming beginnt.
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 der Vorschau, um den Fokus zu fokussieren oder den Fokus zu entfernen. für eine Region.
Die Vorschaufunktion funktioniert mit allgemeinen Bedienungshilfen unter Android, z. B. als TalkBack, Schalterzugriff und Voice Access:
Abbildung 1: Der Webcam-Feed wird an einen Host gestreamt, dessen Vorschau den Feed.
Architektur
Die Architektur, die die Verwendung eines Geräts als Webcam unterstützen soll, ist in
Abbildung 2: Im Folgenden wird der Interaktionsablauf der DeviceAsWebcam
beschrieben.
mit dem Rest des Android-Frameworks kombinieren:
- Der Nutzer wählt in den Einstellungen die USB-Webcam-Option aus.
- Die App „Einstellungen“ sendet einen Binder-Aufruf an
system_server
über die Die KlasseUsbManager
wird darüber informiert, dassFUNCTION_UVC
ausgewählt wurde. - Der Systemserver führt Folgendes aus:
<ph type="x-smartling-placeholder">
- </ph>
- Informiert den USB-Gadget-HAL, die UVC-Gadget-Funktion über eine
setUsbFunctions
HAL-Schnittstellenaufruf. - Informiert den USB-Gadget-HAL, den UVC-Gadget-Treiber mithilfe von ConfigFs.
- Informiert den USB-Gadget-HAL, die UVC-Gadget-Funktion über eine
- Nach dem Empfang eines Callbacks vom HAL des Gadgets sendet
system_server
eine an das Framework übertragen werden, damit sie vomDeviceAsWebcam
-Dienst übernommen werden. - Der USB-Gadget-Treiber startet den Webcam-Stream nach Erhalt der Konfiguration.
Befehle vom Host über V4L2-Knoten unter
/dev/video*
.
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 wird das UVC-Gadget durch das generische Kernel-Image (Generic Kernel Image, GKI) aktiviert (siehe Details unter AOSP-Patch).
UVC in Gadgets HAL unterstützen
Ab Android 14 ist die UVC-Funktion im
GadgetFunction.aidl
HAL-Schnittstelle. Für das Gadget HAL, die UVC
wird das Gadgets auf die gleiche Weise in ConfigFS bereitgestellt wie andere ConfigFS-Funktionen wie
als MTP oder ADB.
Nehmen Sie Änderungen an der Bereitstellung der UVC-Funktion vor, um das HAL des Gadgets zu implementieren. ConfigFS Im Folgenden finden Sie ein Beispiel-Snippet einer HAL-Implementierung eines Gadgets: die die UVC-Funktion unterstützen:
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-Geräts Werbung zeigt. richtigen Kombinationen aus VID und PID.
Weil sich die gesamte UVC-Logik entweder in der Anbieter-Instanz oder im DeviceAsWebcam
befindet
keine UVC-spezifische Logik, außer dass die UVC-Funktion
ConfigFS ist im Gadgets-HAL erforderlich.
Weitere Anleitungen zur Implementierung finden Sie im folgenden Beispielcode in AOSP:
ConfigFS mit UVC-Konfigurationen einrichten
Um den UVC-Gadget-Treiber zu informieren, welche Formate, Größen und Framerates von der Android-Webcam unterstützt wird, richten Sie ConfigFS mit UVC-Konfigurationen ein. Für Weitere Informationen finden Sie in der Upstream-Linux-Dokumentation unter ConfigFS UVC. ABI-Gadget.
Das folgende Beispiel zeigt, wie der 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
# ...
Dieses Snippet richtet den UVC-Gadget-Treiber ein, um einen 1080p-MJPEG-Stream unter zu bewerben. 30 fps. Diese Funktionen werden an den USB-Host übermittelt, wenn er eine Anfrage stellt. unterstützten Auflösungen und Framerates.
Im Folgenden finden Sie allgemeine Richtlinien für die Auswahl der Konfigurationen für die Webcam. bewirbt:
- Die beiden vom
DeviceAsWebcam
-Dienst unterstützten Streamformate sind MJPEG und unkomprimierte YUYV-Datei. - USB 2.0 unterstützt die Datenübertragung mit 480 Mbit/s (60 Mbit/s). Dieses
bedeutet, dass jeder Frame bei 30 fps eine maximale Größe von 2 MB haben muss.
und bei 60 fps und einer maximalen Größe von 1 MB.
- Unkomprimierte Streams (YUYV): Bei 30 fps wird die maximal unterstützte Framerate ist 720p, da YUYV 2 Byte pro Pixel beträgt.
- Komprimierte MJPEG-Streams: Ausgehend von einem Komprimierungsverhältnis von 1:10 von YUV, USB 2.0 unterstützt 4K (1,18 MB pro Frame).
- Primäre Front- und Rückkameras müssen alle Frame-Größen unterstützen, beworben werden. Das liegt daran, dass Nutzer mit die Vorschau-Benutzeroberfläche. Für MJPEG-Streams empfehlen wir Anbietern, eine Auflösung von 480p (640 x 480), 720p (1280 x 820) und 1080p (1920 x 1080), da diese Größen, die von Host-Apps häufig verwendet werden.
- Primäre Front- und Rückkameras müssen alle Framerates unterstützen, die beworben. Wir empfehlen den 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
Zum Aktivieren des Dienstes DeviceAsWebcam
müssen Sie den ro.usb.uvc.enabled
festlegen
Systemeigenschaft in der Datei device.mk
auf true
gesetzt.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Wenn diese Systemeigenschaft aktiviert ist, wird im Menü die Option Webcam Einstellungen, wie in Abbildung 3 dargestellt. Wenn die Option ausgewählt wird, wird das Android-Gerät auf dem Hostgerät als USB-Webcam angezeigt.
Abbildung 3: USB-Einstellungen in den Einstellungen.
Du kannst das Gerät auch über ADB auf die USB-Webcam-Funktion einstellen: Befehl:
adb shell svc usb setFunctions uvc
Bedenken hinsichtlich Stromversorgung und Überhitzung berücksichtigen
„Webcam-Betrieb“ bedeutet, dass die Kamera eines Geräts möglicherweise für mehrere Stunden täglich. Wir empfehlen daher, Maßnahmen zu ergreifen, um sicherzustellen, der Verbrauch und der Überhitzung des Geräts bleiben unter bestimmten Grenzwerten. Die Im Folgenden finden Sie empfohlene Lösungen, um den Stromverbrauch innerhalb von Grenzwerten zu halten:
- Für eine bessere Leistung der Kamera-HAL aktivieren Sie
STREAM_USE_CASE_VIDEO_CALL
imDeviceAsWebcam
-Dienst. Falls die Stromversorgung auch bei aktiviertem
STREAM_USE_CASE_VIDEO_CALL
ein Problem darstellt, gibt der DerDeviceAsWebcam
-Dienst bietet eine Option zum weiteren Reduzieren des Stromverbrauchs über physische Streams konsumieren. Sie können Laufzeitressourcen-Overlays (RROs), um anzugeben, für welche physische Kamera verwenden. Physische Streams verschlechtern die Videoqualität erheblich und führen zu einer verwirrende Nutzererfahrung. Nutzen Sie diese Lösung daher nur als letztes Mittel. Wird optimiertSTREAM_USE_CASE_VIDEO_CALL
ist die bevorzugte Lösung zur Stromversorgung Bedenken. Weitere Informationen zu vonDeviceAsWebcam
unterstützten RROs finden Sie unter readme.md.Das folgende Beispiel zeigt eine RRO, bei der die physische Kamera-ID 3 verwendet wird. statt der logischen Kamera-ID 0. Ein Beispiel in AOSP finden Sie unter DeviceAsWebcamRaven auf.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Bestätigung
Um die Implementierung des Dienstes DeviceAsWebcam
auf deinem Gerät zu testen, verwende
folgenden Tests:
- Test der Webcam des CTS-Verifizierers: Testen Sie, ob Formate, Größen und Framerates werden vom Gerät unterstützt.
- Manuelle Tests: Testen, ob die Webcam-Funktion mit verschiedenen Host-Apps funktioniert auf verschiedenen Host-Betriebssystemen.
Bekannte Probleme
Die folgenden Probleme sind beim Dienst DeviceAsWebcam
bekannt:
Der Stream des UVC-Gadget-Treibers flackert manchmal wie beschädigte Frames aussehen. Dieses Problem wurde behoben und zusammengeführt in Upstream und GKI.
Android-Geräte im Webcam-Modus funktionieren nicht mit USB 3.0+-Kabeln. macOS-Hosts aufgrund eines Fehlers im UVC-Treiber von Apple.