Utiliser un appareil comme webcam

Pour les appareils équipés d'Android 14-QPR1 ou version ultérieure, Android permet de les utiliser en tant que webcam USB. Les appareils Android compatibles avec cette fonctionnalité sont présentés comme des appareils UVC, ce qui permet à un large éventail d'hôtes USB avec différents systèmes d'exploitation (par exemple, Linux, macOS, Windows et ChromeOS) d'utiliser l'appareil photo de l'appareil comme webcam. Le service DeviceAsWebcam accepte 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. L'activité d'aperçu permet à l'utilisateur d'effectuer les opérations suivantes:

  • Prévisualisez l'apparence du flux de la webcam sur la machine hôte avant le début de la diffusion.

  • 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
    • Appuyez sur une zone particulière de l'aperçu pour mettre en surbrillance une zone ou la retirer.

L'activité d'aperçu est compatible avec les fonctionnalités d'accessibilité générales sur Android, telles 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 un aperçu contrôlant le flux.

Architecture

L'architecture permettant l'utilisation d'un appareil en tant que webcam est illustrée dans la figure 2. Vous trouverez ci-dessous la description du flux d'interaction du service 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 la classe UsbManager pour l'informer que FUNCTION_UVC est sélectionné.
  3. Le serveur système effectue les opérations suivantes :
    1. Indique au widget HAL USB de récupérer la fonction du gadget UVC via un 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 widget HAL, system_server envoie une diffusion au framework pour être récupérée par le service DeviceAsWebcam.
  5. Le pilote de gadget USB lance le flux de la webcam lors de la réception des commandes de configuration de l'hôte via les nœuds V4L2 à l'adresse /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 pilote de gadget UVC 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 l'interface HAL GadgetFunction.aidl. Pour le widget HAL, le gadget UVC est installé dans ConfigFS de la même manière que les autres fonctions ConfigFS telles que MTP ou ADB.

Pour implémenter la couche HAL du widget, apportez des modifications pour installer la fonction UVC sur ConfigFS. Voici un exemple d'implémentation HAL de 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 sert de webcam, assurez-vous que le HAL du gadget USB annonce les combinaisons VID/PID appropriées.

Étant donné que toutes les logiques UVC se trouvent dans l'initialisation du fournisseur ou dans le service DeviceAsWebcam, aucune logique spécifique à UVC n'est requise dans le HAL du widget, à l'exception de la liaison symbolique de la fonction UVC à ConfigFS.

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 compatibles avec la webcam Android, configurez ConfigFS avec des configurations UVC. Pour en savoir plus, consultez la documentation Linux en amont sur l'ABI du gadget UVC ConfigFS.

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 diffuser un flux MJPEG 1080p à 30 FPS. Ces fonctionnalités sont communiquées à l'hôte USB lorsqu'il interroge les résolutions et les fréquences d'images compatibles.

Vous trouverez ci-dessous des consignes générales pour sélectionner les configurations annoncées par la webcam:

  • Les deux formats de flux compatibles avec le service DeviceAsWebcam sont MJPEG et YUYV non compressé.
  • L'USB 2.0 permet de transférer des données à 480 Mbit/s (60 Mbit/s). Cela signifie qu'à 30 FPS, chaque image doit avoir une taille maximale de 2 Mo et, à 60 FPS, une taille maximale de 1 Mo.
    • Flux non compressés (YUYV): à 30 FPS, la taille de trame maximale acceptée est de 720p, car YUYV correspond à 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 être compatibles avec toutes les tailles d'image annoncées. En effet, l'utilisateur peut passer d'un ID de caméra à l'autre dans l'aperçu de l'UI. Pour les flux MJPEG, nous recommandons aux fournisseurs d'annoncer les tailles de cadre 480p (640 x 480), 720p (1 280 x 820) et 1080p (1 920 x 1 080), car ce sont des 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 annoncées. 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 l'exemple de correctif AOSP.

Activer la webcam dans le build

Pour activer le service DeviceAsWebcam, vous devez définir la propriété système ro.usb.uvc.enabled 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, une option Webcam apparaît dans l'application Paramètres sous les préférences USB, comme illustré dans la figure 3. Lorsque l'option est sélectionnée, l'appareil Android apparaît en tant que webcam USB sur l'appareil 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 la commande suivante:

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 rester allumée plusieurs heures par jour. Nous vous recommandons donc de prendre des mesures pour vous assurer que la consommation d'énergie et la température de l'appareil ne dépassent pas certaines limites. Voici les 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é, le service DeviceAsWebcam permet de réduire davantage la consommation d'énergie à l'aide de flux physiques. Vous pouvez utiliser des 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 et créent une expérience utilisateur déroutante. N'utilisez cette solution qu'en dernier recours. L'optimisation de STREAM_USE_CASE_VIDEO_CALL est la solution privilégiée pour résoudre les problèmes. Pour en savoir plus sur les RRO compatibles avec le service DeviceAsWebcam, consultez readme.md.

    Voici un exemple de RRO configuré pour utiliser l'ID de caméra physique 3 au lieu de l'ID de caméra logique 0. Pour obtenir 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, les tailles et les fréquences d'images sont compatibles avec l'appareil.
  • Tests manuels: vérifiez que la fonctionnalité de webcam fonctionne avec diverses applications hôtes sur différents systèmes d'exploitation hôtes.

Problèmes connus

Voici les problèmes connus du service DeviceAsWebcam: