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.
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:
- 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 le ClasseUsbManager
informant queFUNCTION_UVC
est sélectionné - Le serveur système effectue les opérations suivantes:
<ph type="x-smartling-placeholder">
- </ph>
- Informe le HAL du gadget USB de récupérer la fonction du gadget UVC via une
Appel d'interface HAL
setUsbFunctions
. - Indique au HAL du gadget USB de configurer le pilote de gadget UVC à l'aide de ConfigF.
- Informe le HAL du gadget USB de récupérer la fonction du gadget UVC via une
Appel d'interface HAL
- 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 serviceDeviceAsWebcam
. - 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*
.
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:
- Ajouter la prise en charge des fonctions UVC
- USBGadget: ajout de la prise en charge de la fonction UVC
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 ambiantes de fonctionnement de l'appareil restent inférieures à certaines limites. La 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 serviceDeviceAsWebcam
. Si l'alimentation pose problème, même lorsque
STREAM_USE_CASE_VIDEO_CALL
est activé, l' Le serviceDeviceAsWebcam
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. OptimisationSTREAM_USE_CASE_VIDEO_CALL
est la solution privilégiée pour alimenter des problèmes. Pour en savoir plus sur les RRO acceptés parDeviceAsWebcam
, 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
:
Le flux du pilote du gadget UVC clignote parfois et montre ce qui ressemble à des cadres corrompus. Ce problème a été résolu et fusionné en amont et dans GKI.
Les appareils Android en mode webcam ne fonctionnent pas avec des câbles USB 3.0+ les hôtes macOS en raison d'un bug avec le pilote UVC d'Apple.