Używanie urządzenia jako kamery internetowej

W przypadku urządzeń z Androidem w wersji 14-QPR1 lub nowszej Android obsługuje korzystanie z urządzenia jako kamery internetowej USB. Urządzenia z Androidem obsługujące tę funkcję są reklamowane jako urządzenia UVC, co umożliwia wielu hostom USB z różnymi systemami operacyjnymi (np. Linux, macOS, Windows i ChromeOS) korzystanie z kamery urządzenia jako kamery internetowej. Usługa DeviceAsWebcam obsługuje tę funkcję, aby można było używać urządzenia jako kamery internetowej.

Usługa DeviceAsWebcam

Usługa DeviceAsWebcam w AOSP zawiera aktywność podglądu (DeviceAsWebcamPreview.java), która umożliwia użytkownikom kadrowanie sceny. Aktywność podglądu umożliwia użytkownikowi:

  • Przed rozpoczęciem strumieniowania możesz wyświetlić podgląd obrazu z kamery internetowej na komputerze hosta.

  • Możesz dostosować obraz z kamery internetowej wysyłany do gospodarza na te sposoby:

    • Wybór kamery do przesyłania strumieniowego: przednia lub tylna.
    • Wybieranie poziomu powiększenia za pomocą suwaka lub przycisków.
    • Kliknięcie konkretnego obszaru podglądu, aby go wyostrzyć lub usunąć.

Aktywność podglądu działa z ogólnymi funkcjami ułatwień dostępu na Androidzie, takimi jak TalkBack, Switch Access i Voice Access.

strumień z kamery internetowej przesyłany do hosta

Rysunek 1. Przekaz obrazu z kamery internetowej przesyłany do gospodarza z podglądem umożliwiającym kontrolowanie obrazu.

Architektura

Architektura umożliwiająca używanie urządzenia jako kamery internetowej jest przedstawiona na rysunku 2. Poniżej opisujemy proces interakcji usługi DeviceAsWebcam z resztą platformy Android:

  1. Użytkownik wybiera opcję kamery internetowej USB w aplikacji Ustawienia.
  2. Aplikacja Ustawienia wysyła do system_server wywołanie bindera za pomocą klasy UsbManager, aby poinformować ją, że wybrana jest FUNCTION_UVC.
  3. Serwer systemowy wykonuje te czynności:
    1. Informuje interfejs HAL gadżetu USB o potrzebie pobrania funkcji gadżetu UVC za pomocą interfejsu setUsbFunctions.
    2. Informuje HAL urządzenia USB, aby skonfigurować sterownik urządzenia UVC za pomocą ConfigFs.
  4. Po otrzymaniu wywołania zwrotnego z interfejsu HAL gadżetu system_server wysyła do frameworku transmisję, którą usługa DeviceAsWebcam ma odebrać.
  5. Sterownik gadżetu USB uruchamia strumień kamery internetowej po otrzymaniu poleceń konfiguracyjnych od hosta za pomocą węzłów V4L2 w miejscu /dev/video*.

architektura urządzenia jako kamery internetowej

Rysunek 2. Architektura DeviceAsWebcam

Implementacja

Z tej sekcji dowiesz się, jak korzystać z urządzenia z Androidem jako kamery internetowej.

Obsługa jądra

W przypadku Androida 14 lub nowszego obraz Generic Kernel Image (GKI) domyślnie włącza sterownik gadżetu UVC (szczegóły znajdziesz w łatce AOSP).

Obsługa UVC w interfejsie HAL gadżetu

Począwszy od Androida 14 funkcja UVC jest dostępna w interfejsie HAL GadgetFunction.aidl. W przypadku interfejsu HAL gadżetu urządzenie UVC jest montowane w systemie ConfigFS w taki sam sposób jak inne funkcje ConfigFS, takie jak MTP czy ADB.

Aby zaimplementować interfejs HAL gadżetu, wprowadź modyfikacje, aby zamontować funkcję UVC w ConfigFS. Oto przykładowy fragment implementacji interfejsu HAL gadżetu obsługującego funkcję 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
       ...
   }
   ...
}

Gdy urządzenie działa jako kamera internetowa, sprawdź, czy interfejs HAL gadżetu USB reklamuje prawidłowe kombinacje VID/PID.

Ponieważ cała logika UVC znajduje się w inicjalizacji dostawcy lub usłudze DeviceAsWebcam, w interfejsie HAL gadżetu nie jest wymagana żadna logika związana z UVC, oprócz linku symbolicznego funkcji UVC do ConfigFS.

Więcej wskazówek dotyczących implementacji znajdziesz w tym przykładowym kodzie w AOSP:

Konfigurowanie ConfigFS za pomocą konfiguracji UVC

Aby poinformować sterownik gadżetu UVC, które formaty, rozmiary i szybkości klatek są obsługiwane przez kamerę internetową Androida, skonfiguruj ConfigFS za pomocą konfiguracji UVC. Więcej informacji znajdziesz w dokumentacji upstream Linuxa dotyczącej interfejsu sterownika ConfigFS UVC.

Poniżej przedstawiamy przykład tego, jak dostawca może skonfigurować sterownik gadżetu UVC (fragment kodu w 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
   # ...

Ten fragment kodu konfiguruje sterownik gadżetu UVC, aby wyświetlał strumień MJPEG 1080p z szybkością 30 fps. Te możliwości są przekazywane do hosta USB, gdy ten przesyła zapytania dotyczące obsługiwanych rozdzielczości i liczb klatek.

Oto ogólne wskazówki dotyczące wyboru konfiguracji reklamowanych przez kamerę internetową:

  • Dwa formaty strumieni danych obsługiwane przez usługę DeviceAsWebcam to MJPEG i niezduplikowane YUYV.
  • USB 2.0 obsługuje transfer danych z prędkością 480 Mb/s (60 MB/s). Oznacza to, że przy 30 fps rozmiar każdej klatki nie może przekraczać 2 MB, a przy 60 fps – 1 MB.
    • Nieskompresowane strumienie (YUYV): przy 30 fps maksymalny obsługiwany rozmiar klatki to 720p, ponieważ YUYV to 2 bajty na piksel.
    • Skompresowane strumienie MJPEG: przy założeniu współczynnika kompresji 1:10 z YUV USB 2.0 może obsługiwać 4K (1,18 MB na ramkę).
  • Główne przednie i tylne aparaty muszą obsługiwać wszystkie rozmiary ramki, które są reklamowane. Dzieje się tak, ponieważ użytkownik może przełączać się między identyfikatorami kamer za pomocą interfejsu podglądu. W przypadku strumieni MJPEG zalecamy, aby dostawcy reklamowali rozmiary klatek 480p (640 x 480), 720p (1280 x 820) i 1080p (1920 x 1080), ponieważ są one często używane przez aplikacje hostujące.
  • Główne przednie i tylne aparaty muszą obsługiwać wszystkie częstotliwości klatek, które są reklamowane. Zdecydowanie zalecamy, aby dostawcy obsługiwali 30 FPS.

Przykład dodawania konfiguracji strumienia z kamery internetowej (ConfigFS) znajdziesz w artykule Przykładowy pakiet poprawek AOSP.

Włączanie kamery internetowej w kompilacji

Aby włączyć usługę DeviceAsWebcam, musisz ustawić w pliku device.mk właściwość systemową ro.usb.uvc.enabled na true.

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

Gdy ta właściwość systemu jest włączona, w aplikacji Ustawienia w ustawieniach USB pojawia się opcja Kamera internetowa, jak pokazano na rysunku 3. Gdy ta opcja jest wybrana, urządzenie z Androidem będzie widoczne dla urządzenia hosta jako kamera USB.

Ustawienia USB w aplikacji Ustawienia

Rysunek 3. Ustawienia USB w aplikacji Ustawienia.

Możesz też ustawić urządzenie jako kamerę internetową USB za pomocą ADB, używając tego polecenia:

adb shell svc usb setFunctions uvc

Zastanów się nad kwestiami związanymi z mocą i temperaturą.

Użycie kamery internetowej oznacza, że kamera urządzenia może być włączona przez wiele godzin dziennie, dlatego zalecamy podjęcie działań, aby zużycie energii i temperatura urządzenia nie przekraczały określonych limitów. Oto zalecane rozwiązania, które pozwolą utrzymać zużycie energii poniżej limitów:

  • Aby uzyskać lepszą wydajność energetyczną komponentu HAL aparatu, włącz STREAM_USE_CASE_VIDEO_CALL w usłudze DeviceAsWebcam.
  • Jeśli zasilanie jest problemem nawet przy włączonym trybie STREAM_USE_CASE_VIDEO_CALL, usługa DeviceAsWebcam umożliwia dalsze zmniejszenie zużycia energii przez wykorzystanie strumieni fizycznych. Aby określić, której kamery fizycznej użyć, możesz użyć nakładek zasobów w czasie wykonywania (RRO). Strumienie fizyczne znacznie obniżają jakość obrazu i powodują dezorientację użytkownika, dlatego stosuj to rozwiązanie tylko w ostateczności. Optymalizacja STREAM_USE_CASE_VIDEO_CALL jest preferowanym rozwiązaniem w przypadku problemów z zasilaniem. Więcej informacji o RRO obsługiwanych przez usługę DeviceAsWebcam znajdziesz w pliku readme.md.

    Poniżej przedstawiamy przykład konfiguracji RRO, która używa fizycznego identyfikatora kamery 3 zamiast logicznego identyfikatora kamery 0. Przykład w AOSP: DeviceAsWebcamRaven.

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

Weryfikacja

Aby przetestować implementację usługi DeviceAsWebcam na urządzeniu, użyj tych testów:

  • Test weryfikujący CTS kamery internetowej: sprawdź, czy urządzenie obsługuje formaty, rozmiary i szybkości klatek.
  • Testy ręczne: sprawdź, czy funkcja kamery internetowej działa z różnymi aplikacjami hosta w różnych systemach operacyjnych.

Znane problemy

Oto znane problemy z usługą DeviceAsWebcam: