Menggunakan perangkat sebagai webcam

Untuk perangkat yang menjalankan Android 14-QPR1 atau yang lebih tinggi, Android mendukung penggunaan perangkat ini sebagai webcam USB. Perangkat Android yang mendukung fitur ini mengiklankan sebagai perangkat UVC, yang memungkinkan berbagai host USB dengan sistem operasi (misalnya, Linux, macOS, Windows, dan ChromeOS) menggunakan kamera perangkat sebagai webcam. Layanan DeviceAsWebcam mendukung fitur ini untuk menggunakan perangkat sebagai webcam.

Layanan DeviceAsWebcam

Layanan DeviceAsWebcam di AOSP menyertakan aktivitas pratinjau (DeviceAsWebcamPreview.java) yang memungkinkan pengguna membingkai suasana. Pratinjau memungkinkan pengguna melakukan hal berikut:

  • Lihat pratinjau tampilan feed webcam di mesin host sebelum melakukan streaming memulai.

  • Sesuaikan feed webcam yang dikirim ke host dengan cara berikut:

    • Memilih kamera untuk streaming, depan atau belakang.
    • Memilih tingkat zoom menggunakan penggeser atau tombol.
    • Mengetuk wilayah tertentu dari pratinjau untuk memfokuskan atau menghapus fokus di suatu wilayah.

Aktivitas pratinjau berfungsi dengan fitur aksesibilitas umum di Android seperti sebagai TalkBack, Tombol Akses, dan Voice Access.

feed webcam di-streaming ke host

Gambar 1. Feed webcam di-streaming ke host dengan pratinjau yang mengontrol feed Anda.

Arsitektur

Arsitektur yang mendukung penggunaan perangkat sebagai {i>webcam<i} diilustrasikan dalam Gambar 2. Berikut ini penjelasan alur interaksi DeviceAsWebcam dengan framework Android lainnya:

  1. Pengguna memilih opsi webcam USB di aplikasi Settings.
  2. Aplikasi Setelan mengirim panggilan binder ke system_server melalui Class UsbManager yang menginformasikan bahwa FUNCTION_UVC dipilih.
  3. Server sistem melakukan hal berikut:
    1. Memberi tahu HAL gadget USB untuk mengambil fungsi gadget UVC melalui setUsbFunctions Panggilan antarmuka HAL.
    2. Memberi tahu HAL gadget USB untuk mengonfigurasi {i>driver<i} gadget UVC menggunakan ConfigF
  4. Setelah menerima callback dari HAL gadget, system_server akan mengirim disiarkan ke framework untuk diambil oleh layanan DeviceAsWebcam.
  5. Driver gadget USB memulai aliran webcam setelah menerima konfigurasi perintah dari host melalui node V4L2 di /dev/video*.

arsitektur perangkat sebagai webcam

Gambar 2. Arsitektur DeviceAsWebcam.

Implementasi

Bagian ini menjelaskan cara mendukung penggunaan perangkat Android sebagai webcam.

Dukungan kernel

Untuk Android 14 atau yang lebih baru, Generic Kernel Image (GKI) mengaktifkan gadget UVC driver secara default (lihat detailnya di Patch AOSP).

Dukung UVC di Gadget HAL

Mulai Android 14, fungsi UVC disertakan dalam GadgetFunction.aidl Antarmuka HAL. Untuk Gadget HAL, UVC gadget dipasang ke ConfigFS dengan cara yang sama seperti fungsi ConfigFS lainnya seperti sebagai MTP atau ADB.

Untuk menerapkan Gadget HAL, buat modifikasi untuk memasang fungsi UVC ke ConfigFS Berikut ini adalah contoh cuplikan implementasi Gadget HAL mendukung fungsi 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
       ...
   }
   ...
}

Saat perangkat bertindak sebagai webcam, pastikan HAL gadget USB sedang menampilkan iklan kombinasi VID/PID yang tepat.

Karena semua logika UVC berada di init vendor atau di DeviceAsWebcam layanan, tidak ada logika khusus UVC, selain melakukan symlink fungsi UVC ke ConfigFS, diperlukan di HAL Gadget.

Untuk panduan implementasi lebih lanjut, lihat kode contoh berikut di AOSP:

Menyiapkan ConfigFS dengan konfigurasi UVC

Untuk menginformasikan {i>driver<i} gadget UVC mengenai format, ukuran, dan didukung oleh webcam Android, siapkan ConfigFS dengan konfigurasi UVC. Sebagai informasi selengkapnya, lihat dokumentasi Linux upstream di ConfigFS UVC ABI gadget.

Berikut adalah contoh cara init vendor dapat menyiapkan driver gadget UVC (cuplikan kode di 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
   # ...

Cuplikan ini menyiapkan driver gadget UVC untuk mengiklankan streaming MJPEG 1080p di 30 fps. Kemampuan ini dikomunikasikan ke {i>host<i} USB ketika melakukan kueri dan resolusi yang didukung.

Berikut adalah panduan umum untuk memilih konfigurasi webcam mengiklankan:

  • Dua format streaming yang didukung oleh layanan DeviceAsWebcam adalah MJPEG dan YUYV yang tidak dikompresi.
  • USB 2.0 mendukung transfer data sebesar 480 Mbps (60 MBps). Ini berarti bahwa pada 30 fps, setiap frame harus memiliki ukuran maksimum 2 MB; dan pada kecepatan 60 fps, ukuran maksimum 1 MB.
    • Streaming yang tidak dikompresi (YUYV): Pada 30 fps, frame maksimum yang didukung adalah 720p karena YUYV adalah 2 byte per piksel.
    • Streaming MJPEG yang dikompresi: Dengan asumsi rasio kompresi 1:10 dari YUV, USB 2.0 dapat mendukung 4K (1,18 MB per frame).
  • Perangkat kamera depan dan belakang utama harus mendukung semua ukuran bingkai yang diiklankan. Hal ini karena pengguna dapat beralih antar-ID kamera menggunakan UI pratinjau. Untuk streaming MJPEG, sebaiknya vendor mengiklankan 480p (640 x 480), 720p (1280 x 820), dan 1080p (1920 x 1080) karena ini adalah ukuran yang biasa digunakan oleh aplikasi {i>host<i}.
  • Perangkat kamera depan dan belakang utama harus mendukung semua kecepatan frame yang diiklankan. Sebaiknya vendor mendukung 30 fps.

Untuk mengetahui contoh penambahan konfigurasi streaming webcam (ConfigFS), lihat Contoh patch AOSP.

Mengaktifkan webcam dalam build

Untuk mengaktifkan layanan DeviceAsWebcam, Anda harus menyetel ro.usb.uvc.enabled properti sistem ke true dalam file device.mk.

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

Jika properti sistem ini diaktifkan, opsi Webcam akan muncul di Aplikasi Settings di bagian preferensi USB seperti yang ditunjukkan di Gambar 3. Jika opsinya adalah dipilih, perangkat Android akan muncul sebagai webcam USB ke perangkat host.

Gambar 3. Preferensi USB di aplikasi Setelan.

Anda juga dapat menyetel perangkat ke fungsi webcam USB melalui ADB menggunakan berikut:

adb shell svc usb setFunctions uvc

Pertimbangkan masalah daya dan termal

Operasi webcam berarti bahwa kamera perangkat mungkin aktif selama beberapa jam sehari, jadi sebaiknya ambil tindakan untuk memastikan bahwa daya konsumsi dan termal perangkat tetap dalam batas tertentu. Tujuan berikut adalah solusi yang direkomendasikan untuk menjaga konsumsi daya tetap di bawah batas:

  • Untuk performa daya yang lebih baik dari HAL kamera, aktifkan STREAM_USE_CASE_VIDEO_CALL di layanan DeviceAsWebcam.
  • Jika daya menjadi masalah meskipun STREAM_USE_CASE_VIDEO_CALL diaktifkan, Layanan DeviceAsWebcam menyediakan opsi untuk mengurangi daya lebih lanjut konsumsi konten dengan menggunakan aliran fisik. Anda dapat menggunakan overlay resource runtime (RRO) untuk menentukan kamera fisik mana yang akan gunakan. Streaming fisik menurunkan kualitas video secara signifikan dan menyebabkan UX yang membingungkan, jadi gunakan solusi ini hanya sebagai opsi terakhir. Mengoptimalkan STREAM_USE_CASE_VIDEO_CALL adalah solusi yang lebih disarankan untuk daya kekhawatiran Anda. Untuk mengetahui informasi selengkapnya tentang RRO yang didukung oleh DeviceAsWebcam lihat readme.md.

    Berikut ini adalah contoh pengaturan RRO untuk menggunakan ID kamera fisik 3 bukannya ID kamera logis 0. Untuk contoh dalam AOSP, lihat DeviceAsWebcamRaven.

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

Verifikasi

Untuk menguji implementasi layanan DeviceAsWebcam di perangkat, gunakan pengujian berikut:

  • Uji pemverifikasi CTS webcam: Uji format, ukuran, dan kecepatan frame yang didukung oleh perangkat.
  • Pengujian manual: Menguji apakah fitur webcam berfungsi dengan berbagai aplikasi host pada berbagai sistem operasi {i>host<i}.

Masalah umum

Berikut adalah masalah umum untuk layanan DeviceAsWebcam: