Używanie urządzenia jako kamery internetowej

W przypadku urządzeń z Androidem 14-QPR1 lub nowszym Android obsługuje używanie urządzenia jako kamery internetowej USB. Urządzenia z Androidem obsługujące tę funkcję są reklamowane jako urządzenia UVC, co umożliwia szerokiej gamie hostów USB z różnymi systemami operacyjnymi (np. Linux, macOS, Windows i ChromeOS) korzystanie z aparatu urządzenia jako kamery internetowej. Usługa DeviceAsWebcam obsługuje tę funkcję, dzięki czemu możesz 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. Podgląd umożliwia użytkownikowi wykonanie tych czynności:

  • Przed rozpoczęciem transmisji możesz sprawdzić, jak obraz z kamery internetowej będzie wyglądać na urządzeniu hosta.

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

    • wybrać kamerę do transmisji strumieniowej – przednią lub tylną;
    • wybieranie poziomu powiększenia za pomocą suwaka lub przycisków;
    • Kliknięcie określonego regionu podglądu, aby ustawić ostrość lub ją usunąć.

Podgląd działa z ogólnymi funkcjami ułatwień dostępu na Androidzie, takimi jak TalkBack, Switch AccessVoice Access.

przekaz z kamery internetowej przesyłany do hosta,

Rysunek 1. Obraz z kamery internetowej przesyłany do gospodarza, który kontroluje go za pomocą podglądu.

Architektura

Architektura obsługująca używanie urządzenia jako kamery internetowej jest przedstawiona na rysunku 2. Poniżej opisujemy przepływ interakcji DeviceAsWebcamusługi z pozostałą częścią 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, informując ją, że wybrano FUNCTION_UVC.
  3. Serwer systemowy wykonuje te czynności:
    1. Informuje warstwę HAL urządzenia USB o pobraniu funkcji urządzenia UVC za pomocą wywołania interfejsu HAL.setUsbFunctions
    2. Informuje HAL urządzenia USB o skonfigurowaniu sterownika urządzenia UVC za pomocą ConfigFs.
  4. Po otrzymaniu wywołania zwrotnego z warstwy HAL gadżetu system_server wysyła transmisję do platformy, która ma zostać odebrana przez usługę DeviceAsWebcam.
  5. Sterownik urządzenia USB rozpoczyna strumień z kamery internetowej po otrzymaniu poleceń konfiguracji z hosta za pomocą węzłów V4L2 w /dev/video*.

architektura urządzenia jako kamery internetowej,

Rysunek 2. architekturę DeviceAsWebcam,

Implementacja

W tej sekcji opisaliśmy, jak obsługiwać używanie urządzenia z Androidem jako kamery internetowej.

Obsługa jądra

W przypadku Androida 14 lub nowszego ogólny obraz jądra (GKI) domyślnie włącza sterownik urządzenia UVC (szczegóły znajdziesz w łatce AOSP).

Obsługa UVC w Gadget HAL

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

Aby zaimplementować Gadget HAL, wprowadź zmiany, aby zamontować funkcję UVC w ConfigFS. Poniżej znajdziesz przykładowy fragment kodu implementacji HAL urządzenia 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 pełni funkcję kamery internetowej, upewnij się, że interfejs HAL gadżetu USB reklamuje prawidłowe kombinacje identyfikatora dostawcy i identyfikatora produktu.

Ponieważ cała logika UVC znajduje się w funkcji inicjowania dostawcy lub w usłudze DeviceAsWebcam, w warstwie HAL urządzenia nie jest wymagana żadna logika specyficzna dla UVC poza utworzeniem linku symbolicznego do funkcji UVC w systemie 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 urządzenia UVC, które formaty, rozmiary i szybkości klatek są obsługiwane przez kamerę internetową Androida, skonfiguruj ConfigFS z konfiguracjami UVC. Więcej informacji znajdziesz w dokumentacji systemu Linux na temat interfejsu ABI gadżetu ConfigFS UVC.

Poniżej znajdziesz przykład tego, jak funkcja init dostawcy może skonfigurować sterownik urządzenia 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 urządzenia UVC do reklamowania strumienia MJPEG o rozdzielczości 1080p przy 30 klatkach na sekundę. Te możliwości są przekazywane do hosta USB, gdy wysyła on zapytanie o obsługiwane rozdzielczości i liczbę klatek na sekundę.

Oto ogólne wskazówki dotyczące wyboru konfiguracji, które kamera internetowa reklamuje:

  • Usługa DeviceAsWebcam obsługuje 2 formaty strumieniowania: MJPEG i nieskompresowany YUYV.
  • USB 2.0 obsługuje transfer danych z prędkością 480 Mb/s (60 MB/s). Oznacza to, że przy 30 klatkach na sekundę każda klatka musi mieć maksymalny rozmiar 2 MB, a przy 60 klatkach na sekundę – 1 MB.
    • Strumienie nieskompresowane (YUYV): przy 30 kl./s 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 interfejs USB 2.0 może obsługiwać rozdzielczość 4K (1,18 MB na klatkę).
  • Główne aparaty przedni i tylny muszą obsługiwać wszystkie reklamowane rozmiary klatek. 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 powszechnie używane przez aplikacje hosta.
  • Główne aparaty przedni i tylny muszą obsługiwać wszystkie reklamowane liczby klatek na sekundę. Zdecydowanie zalecamy, aby dostawcy obsługiwali 30 klatek na sekundę.

Przykład dodawania konfiguracji strumienia z kamery internetowej (ConfigFS) znajdziesz w przykładowej poprawce AOSP.

Włączanie kamery internetowej w kompilacji

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

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

Gdy ta właściwość systemowa jest włączona, w aplikacji Ustawienia w sekcji ustawień USB pojawia się opcja Kamera internetowa, jak pokazano na ilustracji 3. Gdy ta opcja jest wybrana, urządzenie z Androidem jest widoczne dla urządzenia hosta jako kamera internetowa 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

Weź pod uwagę kwestie zasilania i ciepła

Działanie kamery internetowej oznacza, że kamera urządzenia może być włączona przez wiele godzin dziennie, dlatego zalecamy podjęcie działań, które zapewnią, że zużycie energii i temperatura urządzenia pozostaną w określonych granicach. Oto zalecane rozwiązania, które pomogą utrzymać zużycie energii w ramach limitów:

  • Aby poprawić wydajność energetyczną komponentu HAL aparatu, włącz STREAM_USE_CASE_VIDEO_CALL w usłudze DeviceAsWebcam.
  • Jeśli zużycie energii jest problemem nawet przy włączonej usłudze STREAM_USE_CASE_VIDEO_CALL, usługa DeviceAsWebcam oferuje opcję dalszego zmniejszenia zużycia energii przez używanie strumieni fizycznych. Możesz użyć nakładek na zasoby w czasie działania (RRO), aby określić, której kamery fizycznej chcesz używać. Strumienie fizyczne znacznie obniżają jakość wideo i prowadzą do niejasnego UX, dlatego używaj tego rozwiązania tylko w ostateczności. OptymalizacjaSTREAM_USE_CASE_VIDEO_CALL to preferowane rozwiązanie w przypadku problemów z zasilaniem. Więcej informacji o RRO obsługiwanych przez usługę DeviceAsWebcam znajdziesz w pliku readme.md.

    Poniżej znajduje się przykład RRO skonfigurowanego do używania fizycznego identyfikatora kamery 3 zamiast logicznego identyfikatora kamery 0. Przykład w AOSP znajdziesz w artykule DeviceAsWebcamRaven.

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

Weryfikacja

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

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

Znane problemy

Oto znane problemy dotyczące usługi DeviceAsWebcam: