Utilizzare un dispositivo come webcam

Per i dispositivi con Android 14-QPR1 o versioni successive, Android supporta l'utilizzo della come webcam USB. I dispositivi Android che supportano questa funzionalità come dispositivo UVC, che consente a un'ampia gamma di host USB con diverse (ad es. Linux, macOS, Windows e ChromeOS) utilizzano la videocamera del dispositivo come una webcam. Il servizio DeviceAsWebcam supporta questa funzionalità per utilizzare il dispositivo come una webcam.

Servizio DeviceAsWebcam

Il servizio DeviceAsWebcam in AOSP include un'attività di anteprima (DeviceAsWebcamPreview.java) che consente agli utenti di inquadrare la scena. Anteprima consente all'utente di:

  • Visualizza l'anteprima del feed della webcam sulla macchina host prima di trasmettere in streaming .

  • Personalizza il feed della webcam inviato all'host nei seguenti modi:

    • Selezione della videocamera per lo streaming, anteriore o posteriore.
    • Selezione del livello di zoom utilizzando un dispositivo di scorrimento o i pulsanti.
    • Toccare una particolare area dell'anteprima per impostare lo stato attivo o rimuoverlo. in una regione.

L'attività di anteprima funziona con le funzioni di accessibilità generali su Android, come come TalkBack, Switch Access e Voice Access.

feed da webcam trasmesso in streaming all'host

Figura 1. Il feed della webcam viene trasmesso in streaming a un host con un'anteprima che controlla feed.

Architettura

L'architettura da supportare per l'utilizzo di un dispositivo come webcam è illustrata in Figura 2. Di seguito viene descritto il flusso di interazione dell'DeviceAsWebcam con il resto del framework Android:

  1. L'utente seleziona l'opzione webcam USB nell'app Impostazioni.
  2. L'app Impostazioni invia una chiamata a binder a system_server tramite UsbManager corso che lo informa che FUNCTION_UVC è stato selezionato.
  3. Il server di sistema effettua le seguenti operazioni:
    1. Informa l'HAL del gadget USB per recuperare la funzione del gadget UVC attraverso un Chiamata all'interfaccia dell'HAL setUsbFunctions.
    2. Informa l'HAL per il gadget USB di configurare il driver del gadget UVC utilizzando ConfigF.
  4. Quando viene richiamato il gadget HAL, system_server invia un al framework per essere selezionato dal servizio DeviceAsWebcam.
  5. Il driver del gadget USB avvia lo stream della webcam alla ricezione della configurazione dall'host attraverso i nodi V4L2 all'indirizzo /dev/video*.

architettura dispositivo come webcam

Figura 2. Architettura di DeviceAsWebcam.

Implementazione

Questa sezione descrive come supportare l'utilizzo di un dispositivo Android come webcam.

Supporto kernel

Per Android 14 o versioni successive, la GKI (Generic Kernel Image) abilita il widget UVC driver per impostazione predefinita (vedi i dettagli nella patch AOSP).

Supporta UVC in Gadget HAL

A partire da Android 14, la funzione UVC è inclusa nella GadgetFunction.aidl dell'HAL. Per Gadget HAL, gli UVC il gadget viene montato in ConfigFS nello stesso modo di altre funzioni ConfigFS come come MTP o ADB.

Per implementare il gadget HAL, apporta modifiche per montare la funzione UVC su o ConfigFS. Di seguito è riportato un esempio di snippet di un'implementazione dell'HAL per i gadget che supportano la funzione 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
       ...
   }
   ...
}

Quando il dispositivo funge da webcam, assicurati che il gadget USB HAL pubblicizzi le combinazioni VID/PID corrette.

Perché tutta la logica UVC si trova in init del fornitore o nel campo DeviceAsWebcam nessuna logica specifica per l'UVC, a parte la simbolizzazione della funzione UVC a Il comando ConfigFS è obbligatorio nell'HAL del gadget.

Per ulteriori indicazioni sull'implementazione, vedi il seguente codice campione in AOSP:

Imposta ConfigFS con configurazioni UVC

Per comunicare al driver del gadget UVC i formati, le dimensioni e le frequenze fotogrammi supportata dalla webcam Android, configura ConfigFS con configurazioni UVC. Per per ulteriori informazioni, consulta la documentazione upstream di Linux sul documento ConfigFS UVC ABI del gadget.

Di seguito è riportato un esempio di come l'init del fornitore può configurare il driver del gadget UVC (snippet di codice 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
   # ...

Questo snippet imposta il driver del gadget UVC per pubblicizzare uno stream MJPEG da 1080p all'indirizzo 30 f/s. Queste funzionalità vengono comunicate all'host USB quando esegue query risoluzioni e frequenze fotogrammi supportate.

Di seguito sono riportate le linee guida generali per la selezione delle configurazioni della webcam fa pubblicità:

  • I due formati di stream supportati dal servizio DeviceAsWebcam sono MJPEG e YUYV non compresso.
  • USB 2.0 supporta il trasferimento di dati a 480 Mbps (60 MBps). Questo significa che a 30 f/s, ogni frame deve avere una dimensione massima di 2 MB; e a 60 f/s, per una dimensione massima di 1 MB.
    • Stream non compressi (YUYV): a 30 f/s, il numero massimo di fotogrammi supportati è di 720p perché YUYV è di 2 byte per pixel.
    • Stream MJPEG compressi: supponendo un rapporto di compressione 1:10 da YUV, USB 2.0 può supportare la risoluzione 4K (1,18 MB per frame).
  • Le fotocamere principali e posteriori devono supportare tutte le dimensioni di inquadratura vengono annunciati. Questo perché l'utente può passare da un ID videocamera all'altro utilizzando l'interfaccia utente di anteprima. Per gli stream MJPEG, consigliamo ai fornitori di pubblicizzare il formato 480p (640 x 480), 720p (1280 x 820) e 1080p (1920 x 1080) perché si tratta comunemente utilizzate dalle app host.
  • I dispositivi principali delle fotocamere anteriore e posteriore devono supportare tutte le frequenze fotogrammi pubblicizzato. Consigliamo vivamente ai fornitori di supportare la velocità a 30 f/s.

Per un esempio di aggiunta di configurazioni di stream con webcam (ConfigFS), consulta Patch di esempio AOSP.

Attiva la webcam nella build

Per attivare il servizio DeviceAsWebcam, devi impostare ro.usb.uvc.enabled di sistema su true nel file device.mk.

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

Quando questa proprietà di sistema è attiva, nella Impostazioni nelle preferenze USB, come mostrato nella Figura 3. Quando l'opzione è selezionata, il dispositivo Android viene visualizzato come webcam USB per il dispositivo host.

Figura 3. Preferenze USB nell'app Impostazioni.

Puoi anche impostare il dispositivo alla funzione webcam USB tramite ADB utilizzando questo :

adb shell svc usb setFunctions uvc

Considerare i problemi di alimentazione e termica

Operazioni con la webcam significa che la fotocamera di un dispositivo potrebbe essere attiva per più ore al giorno, pertanto consigliamo di adottare misure per garantire che l'alimentazione consumo e termico del dispositivo rimangono al di sotto di determinati limiti. La di seguito sono riportate le soluzioni consigliate per mantenere il consumo energetico entro i limiti:

  • Per migliorare le prestazioni energetiche dell'HAL della fotocamera, abilita STREAM_USE_CASE_VIDEO_CALL nel servizio DeviceAsWebcam.
  • Se l'alimentazione è un problema anche con STREAM_USE_CASE_VIDEO_CALL attivo, la Il servizio DeviceAsWebcam offre un'opzione per ridurre ulteriormente l'alimentazione il consumo eccessivo tramite flussi fisici. Puoi utilizzare overlay di risorse di runtime per specificare la videocamera fisica da utilizzare per gli utilizzi odierni. Gli stream fisici riducono notevolmente la qualità video e causano un'esperienza utente poco chiara, quindi usa questa soluzione solo come ultima risorsa. Ottimizzazione STREAM_USE_CASE_VIDEO_CALL è la soluzione preferita per l'alimentazione i problemi correlati. Per ulteriori informazioni sugli RRO supportati dal DeviceAsWebcam consulta readme.md.

    Di seguito è riportato un esempio di configurazione RRO per l'utilizzo dell'ID fotocamera fisico 3 anziché l'ID fotocamera logica 0. Per un esempio in AOSP, vedi DeviceAsWebcamRaven.

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

Verifica

Per testare l'implementazione del servizio DeviceAsWebcam sul tuo dispositivo, utilizza i seguenti test:

  • Test della webcam dello strumento di verifica CTS: verifica formati, dimensioni e le frequenze fotogrammi sono supportate dal dispositivo.
  • Test manuali: verifica che la funzionalità della webcam funzioni con una serie di app host su una varietà di sistemi operativi host.

Problemi noti

Di seguito sono riportati i problemi noti del servizio DeviceAsWebcam: