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 DeviceAsWebcam
usługi z pozostałą częścią platformy Android:
- Użytkownik wybiera opcję kamery internetowej USB w aplikacji Ustawienia.
- Aplikacja Ustawienia wysyła do
system_server
wywoł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_server
wysył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
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.
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łudzeDeviceAsWebcam
. Jeśli zużycie energii jest problemem nawet przy włączonej usłudze
STREAM_USE_CASE_VIDEO_CALL
, usługaDeviceAsWebcam
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": {&qu
ot;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.