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 Access i Voice Access.
 
 
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:
- Użytkownik wybiera opcję kamery internetowej USB w aplikacji Ustawienia.
- Aplikacja Ustawienia wysyła do system_serverwywołanie bindera za pomocą klasyUsbManager, informując ją, że wybranoFUNCTION_UVC.
- Serwer systemowy wykonuje te czynności:- Informuje warstwę HAL urządzenia USB o pobraniu funkcji urządzenia UVC za pomocą wywołania interfejsu HAL.setUsbFunctions
- Informuje HAL urządzenia USB o skonfigurowaniu sterownika urządzenia UVC za pomocą ConfigFs.
 
- Informuje warstwę HAL urządzenia USB o pobraniu funkcji urządzenia UVC za pomocą wywołania interfejsu HAL.
- Po otrzymaniu wywołania zwrotnego z warstwy HAL gadżetu system_serverwysyła transmisję do platformy, która ma zostać odebrana przez usługęDeviceAsWebcam.
- Sterownik urządzenia USB rozpoczyna strumień z kamery internetowej po otrzymaniu poleceń konfiguracji z hosta za pomocą węzłów V4L2 w /dev/video*.
 
 
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 DeviceAsWebcamobsł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.
 
 
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 uvcWeź 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_CALLw usłudzeDeviceAsWebcam.
- Jeśli zużycie energii jest problemem nawet przy włączonej usłudze - STREAM_USE_CASE_VIDEO_CALL, usługa- DeviceAsWebcamoferuje 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. Optymalizacja- STREAM_USE_CASE_VIDEO_CALLto preferowane rozwiązanie w przypadku problemów z zasilaniem. Więcej informacji o RRO obsługiwanych przez usługę- DeviceAsWebcamznajdziesz 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:
- Strumień sterownika urządzenia UVC czasami migocze i wyświetla coś, co wygląda na uszkodzone klatki. Ten problem został rozwiązany i został scalony z wersją upstream oraz z GKI. - Poprawki na wyższym poziomie: 
 
- Urządzenia z Androidem w trybie kamery internetowej nie działają z kablami USB 3.0+ na hostach macOS z powodu błędu w sterowniku UVC firmy Apple. 
