Gerät als Webcam verwenden

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.

Webcam-Feed auf Host gestreamt

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:

  1. Der Nutzer wählt in den Einstellungen die USB-Webcam-Option aus.
  2. Die App „Einstellungen“ sendet einen Binder-Aufruf über die Klasse UsbManager an system_server und gibt an, dass FUNCTION_UVC ausgewählt ist.
  3. Der Systemserver führt Folgendes aus:
    1. Informiert den USB-Gadget-HAL, die UVC-Gadget-Funktion über einen setUsbFunctions HAL-Schnittstellenaufruf abzurufen.
    2. Informiert den USB-Gadget-HAL, den UVC-Gadget-Treiber mithilfe von ConfigFs zu konfigurieren.
  4. Nach dem Empfang eines Callbacks vom HAL des Gadgets sendet system_server eine Broadcast-Nachricht an das Framework, die vom DeviceAsWebcam-Dienst abgerufen werden soll.
  5. Der USB-Gadget-Treiber startet den Webcam-Stream, nachdem er Konfigurationsbefehle vom Host über V4L2-Knoten unter /dev/video* erhält.

Gerät als Webcam-Architektur

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 im DeviceAsWebcam-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 Dienst DeviceAsWebcam 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 von STREAM_USE_CASE_VIDEO_CALL ist die bevorzugte Lösung, um Bedenken auszuräumen. Weitere Informationen zu vom Dienst DeviceAsWebcam 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: