Używanie urządzenia jako kamery internetowej

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.

transmisja z kamery internetowej na serwer

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:

  1. Użytkownik wybiera opcję kamery internetowej USB w aplikacji Ustawienia.
  2. Aplikacja Ustawienia wysyła wywołanie Binder do system_server za pomocą Klasa UsbManager informująca o wyborze FUNCTION_UVC.
  3. Serwer systemu wykonuje te czynności:
    1. Informuje HAL gadżetu USB o konieczności pobrania funkcji gadżetu UVC za pomocą Wywołanie interfejsu HAL setUsbFunctions.
    2. Informuje HAL gadżetu USB o skonfigurowaniu sterownika gadżetu UVC za pomocą Pliki ConfigF.
  4. 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.
  5. Sterownik gadżetu USB rozpoczyna transmisję z kamery internetowej po otrzymaniu konfiguracji. z hosta przez węzły V4L2 w /dev/video*.

urządzenie jako architektura kamery internetowej

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łudze DeviceAsWebcam.
  • Jeśli nawet przy włączonym STREAM_USE_CASE_VIDEO_CALL masz problem z zasilaniem, Usługa DeviceAsWebcam 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 toku STREAM_USE_CASE_VIDEO_CALL to preferowane rozwiązanie do zasilania potencjalnych problemów. Więcej informacji na temat RRO wspieranych przez DeviceAsWebcam , 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: