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.
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:
- Pengguna memilih opsi webcam USB di aplikasi Settings.
- Aplikasi Setelan mengirim panggilan binder ke
system_server
melalui ClassUsbManager
yang menginformasikan bahwaFUNCTION_UVC
dipilih. - Server sistem melakukan hal berikut:
- Memberi tahu HAL gadget USB untuk mengambil fungsi gadget UVC melalui
setUsbFunctions
Panggilan antarmuka HAL. - Memberi tahu HAL gadget USB untuk mengonfigurasi {i>driver<i} gadget UVC menggunakan ConfigF
- Memberi tahu HAL gadget USB untuk mengambil fungsi gadget UVC melalui
- Setelah menerima callback dari HAL gadget,
system_server
akan mengirim disiarkan ke framework untuk diambil oleh layananDeviceAsWebcam
. - Driver gadget USB memulai aliran webcam setelah menerima konfigurasi
perintah dari host melalui node V4L2 di
/dev/video*
.
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 layananDeviceAsWebcam
. Jika daya menjadi masalah meskipun
STREAM_USE_CASE_VIDEO_CALL
diaktifkan, LayananDeviceAsWebcam
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. MengoptimalkanSTREAM_USE_CASE_VIDEO_CALL
adalah solusi yang lebih disarankan untuk daya kekhawatiran Anda. Untuk mengetahui informasi selengkapnya tentang RRO yang didukung olehDeviceAsWebcam
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
:
Aliran {i>driver<i} gadget UVC terkadang berkedip dan menunjukkan seperti apa {i> frame<i} yang rusak. Masalah ini telah diperbaiki dan digabungkan upstream dan di GKI.
Perangkat Android dalam mode webcam tidak berfungsi dengan kabel USB 3.0+ yang menyala macOS di-host karena ada bug pada driver UVC Apple.