Gerät als Webcam verwenden

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 die 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:

  • Vor dem Streaming in der Vorschau ansehen, wie der Webcam-Feed auf dem Hostcomputer aussehen wird 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 in 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:

Webcam-Feed auf Host gestreamt

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:

  1. Der Nutzer wählt in den Einstellungen die USB-Webcam-Option aus.
  2. Die App „Einstellungen“ sendet einen Binderaufruf an system_server über die Die Klasse UsbManager wird darüber informiert, dass FUNCTION_UVC ausgewählt wurde.
  3. Der Systemserver führt Folgendes aus: <ph type="x-smartling-placeholder">
      </ph>
    1. Informiert den USB-Gadget-HAL, die UVC-Gadget-Funktion über eine setUsbFunctions HAL-Schnittstellenaufruf.
    2. Informiert den USB-Gadget-HAL, den UVC-Gadget-Treiber mithilfe von ConfigFs.
  4. Nach dem Empfang eines Callbacks vom HAL des Gadgets sendet system_server eine an das Framework übertragen werden, damit sie vom DeviceAsWebcam-Dienst übernommen werden.
  5. Der USB-Gadget-Treiber startet den Webcam-Stream nach Erhalt der Konfiguration. Befehle vom Host über V4L2-Knoten unter /dev/video*.

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 wird das UVC-Gadget durch das generische Kernel-Image (Generic Kernel Image, GKI) aktiviert (siehe Details unter AOSP-Patch).

UVC in Gadget HAL unterstützen

Ab Android 14 ist die UVC-Funktion im GadgetFunction.aidl HAL-Schnittstelle. Für das Gadgets HAL, die UVC wird das Gadgets auf die gleiche Weise in ConfigFS wie andere ConfigFS-Funktionen bereitgestellt, als MTP oder ADB.

Nehmen Sie Änderungen vor, um die UVC-Funktion auf ConfigFS Im Folgenden finden Sie ein Beispiel-Snippet einer HAL-Implementierung eines Gadgets: 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-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 dem USB-Host mitgeteilt, 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, 480p (640 x 480), 720p (1280 x 820) und 1080p (1920 x 1080), da diese Größen, die häufig von Host-Apps 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 im DeviceAsWebcam-Dienst.
  • Falls die Stromversorgung auch bei aktiviertem STREAM_USE_CASE_VIDEO_CALL ein Problem darstellt, gibt der Der DeviceAsWebcam-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 deutlich und führen zu einer verwirrende Nutzererfahrung. Nutzen Sie diese Lösung daher nur als letztes Mittel. Wird optimiert STREAM_USE_CASE_VIDEO_CALL ist die bevorzugte Lösung zur Stromversorgung Bedenken. Weitere Informationen zu von DeviceAsWebcam 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: