Pour les appareils équipés d'Android 14-QPR1 ou version ultérieure, Android permet d'utiliser l'appareil comme webcam USB. Les appareils Android compatibles avec cette fonctionnalité sont annoncés en tant que appareil UVC, ce qui permet à un large éventail d'hôtes USB avec différents systèmes d'exploitation (Linux, macOS, Windows et ChromeOS, par exemple) d'utiliser la caméra de l'appareil comme webcam. Le service DeviceAsWebcam
est compatible avec 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:
Aperçu de l'apparence du flux de la webcam sur la machine hôte avant le début de la diffusion
Personnalisez le flux de webcam envoyé à l'hôte de la manière suivante:
- Sélection de la caméra à diffuser, avant ou arrière.
- Sélectionner le niveau de zoom à l'aide d'un curseur ou de boutons
- Appuyer sur une région spécifique de l'aperçu pour mettre au point ou supprimer la mise au point sur une région.
L'activité d'aperçu fonctionne avec les fonctionnalités d'accessibilité générales sur Android, telles que TalkBack, Switch Access et Voice Access.
Figure 1 : Flux de webcam diffusé vers un hôte avec un aperçu qui contrôle le flux.
Architecture
L'architecture permettant d'utiliser un appareil en tant que webcam est illustrée dans la figure 2. Ce qui suit décrit le flux d'interaction du service DeviceAsWebcam
avec le reste du framework Android:
- L'utilisateur sélectionne l'option de webcam USB dans l'application Paramètres.
- L'application Paramètres envoie un appel de liaison à
system_server
via la classeUsbManager
pour l'informer queFUNCTION_UVC
est sélectionné. - Le serveur système effectue les opérations suivantes :
- Informe le HAL du gadget USB de récupérer la fonction du gadget UVC via un appel d'interface HAL
setUsbFunctions
. - Informe le HAL du gadget USB de configurer le pilote du gadget UVC à l'aide de ConfigFs.
- Informe le HAL du gadget USB de récupérer la fonction du gadget UVC via un appel d'interface HAL
- À la réception d'un rappel de la HAL du gadget,
system_server
envoie une diffusion au framework pour être récupérée par le serviceDeviceAsWebcam
. - Le pilote du gadget USB démarre le flux de la webcam lorsqu'il reçoit des commandes de configuration de l'hôte via des nœuds V4L2 à
/dev/video*
.
Figure 2. Architecture DeviceAsWebcam.
Implémentation
Cette section explique comment utiliser un appareil Android comme webcam.
Prise en charge du noyau
Pour Android 14 ou version ultérieure, l'image du noyau générique (GKI) active le pilote de gadget UVC par défaut (voir les détails dans le correctif AOSP).
Prise en charge de l'UVC dans le HAL Gadget
À partir d'Android 14, la fonction UVC est incluse dans l'interface HAL GadgetFunction.aidl
. Pour le HAL Gadget, le gadget UVC est installé sur ConfigFS de la même manière que les autres fonctions ConfigFS telles que MTP ou ADB.
Pour implémenter le HAL Gadget, apportez des modifications pour monter la fonction UVC sur ConfigFS. Voici un exemple d'extrait d'implémentation de HAL 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 joue le rôle de webcam, assurez-vous que le HAL du gadget USB annonce les combinaisons VID/PID appropriées.
Étant donné que toute la logique UVC se trouve dans l'initialisation du fournisseur ou dans le service DeviceAsWebcam
, aucune logique spécifique à l'UVC, à l'exception d'un lien symbolique de la fonction UVC vers ConfigFS, n'est requise dans le HAL du gadget.
Pour obtenir des conseils sur l'implémentation, consultez l'exemple de code suivant dans AOSP:
Configurer ConfigFS avec des configurations UVC
Pour indiquer au pilote du 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.
Vous trouverez ci-dessous un exemple de configuration du pilote de gadget UVC par l'init du fournisseur (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 du gadget UVC pour annoncer 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.
Voici quelques consignes générales pour sélectionner les configurations que la webcam annonce:
- Les deux formats de flux compatibles avec le service
DeviceAsWebcam
sont MJPEG et YUYV non compressé. - L'USB 2.0 accepte le transfert de données à 480 Mbit/s (60 Mo/s). Cela signifie qu'à 30 ips, chaque frame doit avoir une taille maximale de 2 Mo et à 60 ips, une taille maximale de 1 Mo.
- Flux non compressés (YUYV): à 30 images par seconde, la taille de frame maximale prise en charge est de 720p, car YUYV est de 2 octets par pixel.
- Flux MJPEG compressés: en supposant un taux de compression de 1:10 à partir de YUV, USB 2.0 est compatible avec la 4K (1,18 Mo par frame).
- Les appareils photo avant et arrière principaux doivent être compatibles avec toutes les tailles de cadre annoncées. En effet, l'utilisateur peut basculer entre les ID de caméra à l'aide de l'UI d'aperçu. Pour les flux MJPEG, nous recommandons aux fournisseurs de diffuser les tailles de frame 480p (640 x 480), 720p (1 280 x 820) et 1080p (1 920 x 1 080), car elles sont couramment utilisées par les applications hôtes.
- Les appareils photo avant et arrière principaux doivent être compatibles avec toutes les fréquences d'images annoncées. Nous recommandons vivement aux fournisseurs de prendre en charge les 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 s'affiche dans l'application Paramètres sous "Préférences USB", comme illustré dans la figure 3. Lorsque cette option est sélectionnée, l'appareil Android apparaît comme une webcam USB pour l'appareil hôte.
Figure 3. Préférences USB dans l'application Paramètres.
Vous pouvez également définir la fonction de webcam USB sur l'appareil via ADB à l'aide de la commande suivante:
adb shell svc usb setFunctions uvc
Tenir compte des problèmes d'alimentation et de température
Les opérations de webcam signifient que la caméra d'un appareil peut être 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 restent dans certaines limites. Vous trouverez ci-dessous des solutions recommandées pour limiter la consommation d'énergie:
- Pour de meilleures performances énergétiques de la couche HAL de l'appareil photo, activez
STREAM_USE_CASE_VIDEO_CALL
dans le serviceDeviceAsWebcam
. Si l'alimentation pose problème même lorsque
STREAM_USE_CASE_VIDEO_CALL
est activé, le serviceDeviceAsWebcam
offre une option permettant de réduire davantage la consommation d'énergie en utilisant des 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é vidéo et entraînent une expérience utilisateur confuse. N'utilisez cette solution qu'en dernier recours. L'optimisation deSTREAM_USE_CASE_VIDEO_CALL
est la solution privilégiée pour les problèmes d'alimentation. Pour en savoir plus sur les RRO compatibles avec le serviceDeviceAsWebcam
, consultez readme.md.Vous trouverez ci-dessous 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:
- Test de vérification CTS de la webcam: 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 différentes applications hôtes sur différents systèmes d'exploitation hôtes.
Problèmes connus
Voici les problèmes connus du service DeviceAsWebcam
:
Le flux du pilote du gadget UVC clignote parfois et affiche ce qui ressemble à des trames corrompues. Ce problème a été résolu et fusionné en amont et dans GKI.
Les appareils Android en mode webcam ne fonctionnent pas avec les câbles USB 3.0 et versions ultérieures sur les hôtes macOS en raison d'un bug avec le pilote UVC d'Apple.