Na urządzeniach z Androidem 14-QPR1 lub nowszym
jako kamery internetowej USB. Urządzenia z Androidem obsługujące tę funkcję są reklamowane
jako urządzenie UVC, które umożliwia korzystanie z szerokiej gamy hostów USB z różnymi
w systemach operacyjnych (np. Linux, macOS, Windows i ChromeOS) należy użyć parametru
i używać ich 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ść w wersji testowej
(DeviceAsWebcamPreview.java
), który umożliwia użytkownikom kadrowanie sceny. Podgląd
pozwala użytkownikowi na:
Przed rozpoczęciem transmisji sprawdź, jak obraz z kamery internetowej będzie wyglądać na hoście zaczyna się.
Dostosuj obraz z kamery internetowej wysyłany do hosta w jeden z tych sposobów:
- wybór kamery do transmitowania – z przodu lub z tyłu;
- Wybieranie poziomu powiększenia za pomocą suwaka lub przycisków.
- kliknięcie określonego obszaru podglądu, aby ustawić lub wyłączyć ostrość. w danym regionie.
Aktywność w wersji testowej działa z ogólnymi ułatwieniami dostępu na Androidzie, takimi jak jak TalkBack, Switch Access oraz Voice Access.
Rysunek 1. obraz z kamery internetowej jest przesyłany do hosta, a podgląd kontroluje kanału.
Architektura
Architektura umożliwiająca korzystanie z urządzenia jako kamery internetowej została przedstawiona
Rysunek 2. Poniżej znajdziesz opis przepływu interakcji w DeviceAsWebcam
z pozostałymi elementami platformy Androida:
- Użytkownik wybiera opcję kamery internetowej USB w aplikacji Ustawienia.
- Aplikacja Ustawienia wysyła wywołanie Binder do
system_server
za pomocą KlasaUsbManager
informująca o wyborzeFUNCTION_UVC
. - Serwer systemu wykonuje te czynności:
- Informuje HAL gadżetu USB o konieczności pobrania funkcji gadżetu UVC za pomocą
Wywołanie interfejsu HAL
setUsbFunctions
. - Informuje HAL gadżetu USB o skonfigurowaniu sterownika gadżetu UVC za pomocą Pliki ConfigF.
- Informuje HAL gadżetu USB o konieczności pobrania funkcji gadżetu UVC za pomocą
Wywołanie interfejsu HAL
- Po otrzymaniu wywołania zwrotnego z HAL gadżetu
system_server
wysyła wiadomość transmisję do platformy, która ma być odbierana przez usługęDeviceAsWebcam
. - Sterownik gadżetu USB rozpoczyna transmisję z kamery internetowej po otrzymaniu konfiguracji.
z hosta przez węzły V4L2 w
/dev/video*
.
Rysunek 2. Architektura DeviceAsWebcam.
Implementacja
W tej sekcji opisano obsługę korzystania z urządzenia z Androidem jako kamery internetowej.
Obsługa jądra systemu
W przypadku Androida 14 lub nowszego ogólny obraz jądra (GKI) włącza gadżet UVC (szczegóły znajdziesz w poprawce AOSP).
Obsługa UVC w HAL gadżetów
Począwszy od Androida 14 funkcja UVC jest dostępna
GadgetFunction.aidl
Interfejs HAL. W przypadku HAL gadżetów (UVC)
jest podłączany do ConfigFS w taki sam sposób, jak inne funkcje ConfigFS, takie jak
jako MTP lub ADB.
Aby zaimplementować HAL gadżetów, wprowadź zmiany, by podłączyć funkcję UVC w ConfigFS. Poniżej znajduje się przykładowy fragment implementacji HAL gadżetów obsługujące 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 jak kamera internetowa, upewnij się, że HAL gadżet USB jest reklamowany odpowiednie kombinacje VID i PID.
Ponieważ cała logika UVC znajduje się w inicjowaniu dostawcy lub w DeviceAsWebcam
żadnej logiki UVC, z wyjątkiem połączenia symbolicznego funkcji UVC z funkcją
Plik ConfigFS jest wymagany w HAL gadżetów.
Więcej wskazówek dotyczących implementacji znajdziesz w tym przykładowym kodzie w AOSP:
Konfigurowanie ConfigFS z konfiguracjami UVC
W celu informowania sterownika gadżetu UVC o formatach, rozmiarach i liczbie klatek przez kamerę internetową na Androida, skonfiguruj ConfigFS z konfiguracjami UVC. Dla: więcej informacji znajdziesz w dokumentacji nadrzędnego systemu Linux dotyczącej komponentu UVC ConfigFS interfejsu ABI gadżetu.
Oto przykład, 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 do reklamowania strumienia MJPEG w rozdzielczości 1080p 30 kl./s Te możliwości są przekazywane do hosta USB podczas wysyłania zapytań w obsługiwanych rozdzielczościach i liczbie klatek.
Oto ogólne wskazówki dotyczące wyboru konfiguracji kamery internetowej reklamuje:
- Usługa
DeviceAsWebcam
obsługuje 2 formaty strumieniowania: MJPEG oraz nieskompresowany plik YUYV. - USB 2.0 umożliwia przesyłanie danych z szybkością 480 Mb/s (60 Mb/s). Ten
oznacza, że przy 30 klatkach na sekundę maksymalna wielkość każdej klatki wynosi 2 MB;
a przy 60 klatkach na sekundę maksymalny rozmiar to 1 MB.
- Nieskompresowane strumienie (YUYV): przy 30 klatkach na sekundę maksymalna obsługiwana liczba klatek. rozmiar to 720p, ponieważ YUYV to 2 bajty na piksel.
- Skompresowane strumienie MJPEG: przy założeniu współczynnika kompresji 1:10 dla YUV USB 2.0 obsługuje rozdzielczość 4K (1,18 MB na klatkę).
- Główne urządzenia z przednim i tylnym aparatem muszą obsługiwać wszystkie rozmiary ramki, są reklamowane. Dzieje się tak, ponieważ użytkownik może przełączać się między identyfikatorami kamer za pomocą w interfejsie podglądu. W przypadku strumieni MJPEG zalecamy, by dostawcy reklamowali rozdzielczość 480p (640 x 480), 720p (1280 x 820) i 1080p (1920 x 1080), ponieważ te rozmiary często używane przez aplikacje hostujące.
- Główne urządzenia z przodu i tylnego aparatu muszą obsługiwać wszystkie: reklamowanych. Zdecydowanie zalecamy, by dostawcy obsługiwały 30 klatek na sekundę.
Przykład dodawania konfiguracji strumienia z kamery internetowej (ConfigFS) znajdziesz tutaj: Przykładowa poprawka AOSP.
Włącz kamerę internetową w kompilacji
Aby włączyć usługę DeviceAsWebcam
, musisz skonfigurować ro.usb.uvc.enabled
właściwość systemową do true
w pliku device.mk
.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Po włączeniu tej usługi systemowej w oknie dialogowym wyświetla się opcja Kamera internetowa. Ustawienia w sekcji Ustawienia USB, jak pokazano na rys. 3. Gdy opcja jest oznacza to, że urządzenie z Androidem będzie widoczne na urządzeniu jako kamera internetowa USB.
Rysunek 3. Ustawienia USB w aplikacji Ustawienia.
Możesz też ustawić na urządzeniu funkcję kamery internetowej USB przez ADB, polecenie:
adb shell svc usb setFunctions uvc
Weź pod uwagę problemy z zasilaniem i temperaturą
Działanie kamery internetowej oznacza, że kamera urządzenia może być włączona przez kilka godzin na dobę, zalecamy więc podjęcie działań mających na celu zapewnienie zużycie energii i temperatura urządzenia mieści się w pewnych limitach. Oto zalecane rozwiązania pozwalające ograniczyć zużycie energii:
- Włącz
STREAM_USE_CASE_VIDEO_CALL
w usłudzeDeviceAsWebcam
. Jeśli nawet przy włączonym
STREAM_USE_CASE_VIDEO_CALL
masz problem z zasilaniem, UsługaDeviceAsWebcam
umożliwia dalsze zmniejszenie zużycia energii za pomocą fizycznych strumieni. Za pomocą nakładki zasobów środowiska wykonawczego do określania, który aparat fizyczny ma i ich używanie. Strumienie fizyczne znacznie obniżają jakość filmu i prowadzą jest niejasne, więc korzystaj z tego rozwiązania tylko w ostateczności. Optymalizacja w tokuSTREAM_USE_CASE_VIDEO_CALL
to preferowane rozwiązanie do zasilania potencjalnych problemów. Więcej informacji na temat RRO wspieranych przezDeviceAsWebcam
, patrz readme.md.Oto przykład konfiguracji RRO z wykorzystaniem identyfikatora 3 aparatu fizycznego 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
w tych testach:
- Kamera internetowa – test weryfikatora CTS: sprawdź, czy formaty, rozmiary i liczba klatek na sekundę jest obsługiwana przez urządzenie.
- Testy ręczne: sprawdź, czy funkcja kamery internetowej działa z różnymi aplikacjami hostującymi w różnych systemach operacyjnych.
Znane problemy
Oto znane problemy dotyczące usługi DeviceAsWebcam
:
Strumień sterownika gadżetu UVC czasami migocze, aby zobaczyć, jak wyglądają uszkodzone klatki. Ten problem został rozwiązany i połączony w górę i w GKI.
Urządzenia z Androidem w trybie kamery internetowej nie działają z włączoną obsługą kabli USB 3.0+ Hosty macOS z powodu błędu w sterowniku UVC firmy Apple.