Utiliser un appareil comme webcam

Pour les appareils équipés d'Android 14-QPR1 ou version ultérieure, Android prend en charge l'utilisation du comme webcam USB. Les appareils Android compatibles avec cette fonctionnalité sont des annonces en tant qu'appareil UVC, ce qui permet à un large éventail d'hôtes USB avec différentes systèmes d'exploitation (Linux, macOS, Windows et ChromeOS, par exemple) utilisent le la caméra de votre appareil en tant que webcam. Service DeviceAsWebcam prend en charge cette fonctionnalité pour utiliser l'appareil comme webcam.

Service DeviceAsWebcam

Le service DeviceAsWebcam dans AOSP inclut une activité d'aperçu (DeviceAsWebcamPreview.java) qui permet aux utilisateurs de cadrer la scène. Aperçu permet à l'utilisateur d'effectuer les opérations suivantes:

  • Prévisualisez le flux de la webcam sur la machine hôte avant la diffusion. démarre.

  • Vous pouvez personnaliser le flux de la webcam envoyé à l'hôte comme suit:

    • Sélectionnez la caméra dont vous souhaitez diffuser le flux (avant ou arrière).
    • Sélection du niveau de zoom à l'aide d'un curseur ou de boutons
    • Appuyer sur une zone particulière de l'aperçu pour effectuer la mise au point ou la retirer dans une région.

L'activité d'aperçu fonctionne avec les fonctionnalités d'accessibilité générales sur Android telles que tels que TalkBack, Switch Access et Voice Access.

flux de la webcam diffusé vers l'organisateur

Figure 1 : Flux de webcam diffusé vers un hôte avec l'aperçu contrôlant la flux.

Architecture

L'architecture permettant l'utilisation d'un appareil en tant que webcam est illustrée dans Figure 2. Vous trouverez ci-dessous la description du flux d'interaction de la méthode DeviceAsWebcam. avec le reste du framework Android:

  1. L'utilisateur sélectionne l'option de webcam USB dans l'application Paramètres.
  2. L'application Paramètres envoie un appel de liaison à system_server via le Classe UsbManager informant que FUNCTION_UVC est sélectionné
  3. Le serveur système effectue les opérations suivantes: <ph type="x-smartling-placeholder">
      </ph>
    1. Informe le HAL du gadget USB de récupérer la fonction du gadget UVC via une Appel d'interface HAL setUsbFunctions.
    2. Indique au HAL du gadget USB de configurer le pilote de gadget UVC à l'aide de ConfigF.
  4. Lors de la réception d'un rappel du gadget HAL, system_server envoie une annonce au framework pour être récupérée par le service DeviceAsWebcam.
  5. Le pilote du gadget USB lance le flux de la webcam lors de la réception de la configuration. depuis l'hôte via des nœuds V4L2 au niveau de /dev/video*.

comme architecture de webcam

Figure 2. Architecture de DeviceAsWebcam.

Implémentation

Cette section explique comment prendre en charge l'utilisation d'un appareil Android en tant que webcam.

Prise en charge du kernel

Pour Android 14 ou version ultérieure, l'image du noyau générique (GKI) active le widget UVC. pilote par défaut (pour en savoir plus, consultez le correctif AOSP).

Prise en charge de l'UVC dans le widget HAL

À partir d'Android 14, la fonction UVC est incluse dans GadgetFunction.aidl Interface HAL. Pour le gadget HAL, l'UVC le gadget est installé dans ConfigFS de la même manière que les autres fonctions ConfigFS telles que comme MTP ou ADB.

Pour implémenter la couche HAL du widget, apportez des modifications pour installer la fonction UVC sur dans ConfigFS. Voici un exemple d'implémentation de la fonction HAL d'un gadget. compatible avec la fonction UVC:

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
       ...
   }
   ...
}

Lorsque l'appareil fait office de webcam, assurez-vous que le gadget USB HAL diffuse de la publicité. les bonnes combinaisons VID/PID.

Étant donné que toute la logique UVC se trouve dans l'initialisation du fournisseur ou dans DeviceAsWebcam aucune logique spécifique à UVC, à l'exception de la liaison symbolique de la fonction UVC pour ConfigFS, est requis dans la fonction HAL du widget.

Pour en savoir plus sur l'implémentation, consultez l'exemple de code suivant dans AOSP:

Configurer ConfigFS avec des configurations UVC

Pour indiquer au pilote de gadget UVC les formats, tailles et fréquences d'images compatible avec la webcam Android, configurez ConfigFS avec des configurations UVC. Pour Pour plus d'informations, consultez la documentation Linux en amont sur la propriété ConfigFS UVC ABI du gadget.

Voici un exemple de la façon dont l'initialisation du fournisseur peut configurer le pilote de gadget UVC (extrait de code dans 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
   # ...

Cet extrait configure le pilote de gadget UVC pour promouvoir un flux MJPEG 1080p à l'adresse 30 FPS Ces capacités sont communiquées à l'hôte USB lorsqu'il interroge et les fréquences d'images compatibles.

Vous trouverez ci-dessous des consignes générales pour sélectionner les configurations de la webcam. diffuse:

  • Les deux formats de flux compatibles avec le service DeviceAsWebcam sont MJPEG et une table YUYV non compressée.
  • L'USB 2.0 permet de transférer des données à 480 Mbit/s (60 Mbit/s). Ce signifie qu'à 30 FPS, la taille de chaque image ne doit pas dépasser 2 Mo. et à 60 FPS, pour une taille maximale de 1 Mo.
    • Flux non compressés (YUYV): à 30 FPS, la fréquence d'images maximale autorisée la taille est de 720p, car YUYV est de 2 octets par pixel.
    • Flux MJPEG compressés: en supposant un taux de compression YUV de 1:10, L'USB 2.0 est compatible avec la 4K (1,18 Mo par image).
  • Les caméras avant et arrière principales doivent prendre en charge toutes les tailles d'image sont promus. En effet, l'utilisateur peut passer d'un ID de caméra à l'autre l'UI d'aperçu. Pour les flux MJPEG, nous recommandons aux fournisseurs d'afficher des annonces en 480p (640 x 480), 720p (1 280 x 820) et 1080p (1 920 x 1 080), car il s'agit tailles couramment utilisées par les applications hôtes.
  • Les caméras avant et arrière principales doivent être compatibles avec toutes les fréquences d'images est annoncée. Nous vous recommandons vivement de proposer une fréquence d'images de 30 FPS.

Pour obtenir un exemple d'ajout de configurations de flux de webcam (ConfigFS), consultez Exemple de correctif AOSP

Activer la webcam dans le build

Pour activer le service DeviceAsWebcam, vous devez définir le ro.usb.uvc.enabled la propriété système sur true dans le fichier device.mk.

# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
    ro.usb.uvc.enabled=true

Lorsque cette propriété système est activée, l'option Webcam apparaît dans la Paramètres sous "Préférences USB", comme illustré dans la figure 3. Lorsque cette option est l'appareil Android apparaît comme une webcam USB sur le périphérique hôte.

Figure 3. Préférences USB dans l'application Paramètres.

Vous pouvez également définir l'appareil sur la fonction de webcam USB via ADB à l'aide de ce :

adb shell svc usb setFunctions uvc

Tenir compte des préoccupations liées à l'alimentation et à la température

Le fonctionnement de la webcam signifie que la caméra d'un appareil peut être allumée pendant plusieurs heures par jour, nous vous recommandons donc de prendre des mesures pour vous assurer que l'alimentation la consommation et la température de l'appareil restent inférieures à certaines limites. La Voici quelques solutions recommandées pour maintenir une consommation d'énergie en deçà des limites:

  • Pour améliorer les performances d'alimentation du HAL de la caméra, activez STREAM_USE_CASE_VIDEO_CALL dans le service DeviceAsWebcam.
  • Si l'alimentation pose problème, même lorsque STREAM_USE_CASE_VIDEO_CALL est activé, l' Le service DeviceAsWebcam permet de réduire davantage la consommation d'énergie à l'aide de flux physiques. Vous pouvez utiliser superpositions de ressources d'exécution (RRO) pour spécifier la caméra physique à utiliser. Les flux physiques réduisent considérablement la qualité de la vidéo UX déroutante, alors n’utilisez cette solution qu’en dernier recours. Optimisation STREAM_USE_CASE_VIDEO_CALL est la solution privilégiée pour alimenter des problèmes. Pour en savoir plus sur les RRO acceptés par DeviceAsWebcam, consultez readme.md.

    Voici un exemple de RRO configuré pour utiliser l'ID de caméra physique 3 au lieu de l'identifiant logique de la caméra 0. Pour voir un exemple dans AOSP, consultez DeviceAsWebcamRaven :

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

Validation

Pour tester votre implémentation du service DeviceAsWebcam sur votre appareil, utilisez les tests suivants:

  • Webcam de test du vérificateur CTS: vérifiez que les formats, tailles et les fréquences d'images sont compatibles avec l'appareil.
  • Tests manuels: vérifier que la webcam fonctionne avec diverses applications hôtes sur divers systèmes d'exploitation hôtes.

Problèmes connus

Voici les problèmes connus du service DeviceAsWebcam: