Platform Android mendukung penggunaan kamera USB plug-and-play (yaitu, webcam) menggunakan standar API Camera2 Android dan kamera HAL dalam antarmuka berbasis web yang sederhana. Webcam umumnya mendukung Class video USB (UVC) {i>driver<i} dan di Linux, standar Video4Linux (V4L) {i>driver<i} digunakan untuk mengontrol kamera UVC.
Dengan dukungan untuk webcam, perangkat dapat digunakan dalam kasus penggunaan ringan seperti video chat dan kios foto. Fitur ini tidak menggantikan sistem operasi internal HAL kamera pada ponsel Android dan tidak dirancang untuk mendukung tugas-tugas intensif dan kompleks yang melibatkan resolusi tinggi dan streaming berkecepatan tinggi, AR, dan kontrol ISP/sensor/lensa manual.
Proses HAL kamera USB adalah bagian dari penyedia kamera eksternal yang mendengarkan ketersediaan perangkat USB dan menghitung perangkat kamera eksternal sebagaimana mestinya. Proses ini memiliki izin dan kebijakan SE yang mirip dengan proses HAL kamera bawaan. Aplikasi webcam pihak ketiga yang berkomunikasi secara langsung dengan perangkat USB memerlukan izin kamera yang sama untuk mengakses UVC seperti layaknya aplikasi kamera biasa.
Contoh dan sumber
Untuk informasi selengkapnya tentang cara menerapkan kamera USB, lihat kamera eksternal
implementasi referensi penyedia di
ExternalCameraProvider
Perangkat kamera eksternal dan penerapan sesi disertakan dalam
ExternalCameraDevice
dan
ExternalCameraDeviceSession
.
Mulai level API 28, API klien Java menyertakan
EXTERNAL
di tingkat hardware.
Implementasi
Implementasinya harus mendukung
android.hardware.usb.host
fitur sistem.
Dukungan kernel untuk perangkat UVC juga harus diaktifkan. Anda dapat mengaktifkannya dengan
menambahkan berikut ini ke file defconfig
kernel masing-masing.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Untuk mengaktifkan penyedia kamera eksternal di build perangkat masing-masing, yang menambahkan izin SELinux yang diperlukan, konfigurasi kamera eksternal, dan dependensi penyedia kamera eksternal, selesaikan langkah-langkah berikut:
Tambahkan file konfigurasi kamera eksternal dan library kamera eksternal ke
device.mk
.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
Tambahkan nama penyedia kamera eksternal ke manifes Treble HAL perangkat.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(Opsional) Jika perangkat berjalan dalam mode Treble passthrough, update
sepolicy
sehinggacameraserver
dapat mengakses kamera UVC.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
Berikut adalah contoh external_camera_config.xml
(baris hak cipta dihilangkan).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
Penyesuaian
Anda dapat meningkatkan kualitas kamera Android melalui opsi penyesuaian umum atau pengoptimalan khusus perangkat.
Penyesuaian umum
Anda dapat menyesuaikan penyedia kamera eksternal dengan mengubah
File external_camera_config.xml
. Secara khusus, klien dapat menyesuaikan
parameter berikut:
- Mengecualikan node video kamera internal
- Batas atas kecepatan frame dan ukuran gambar yang didukung
- Jumlah buffer yang sedang berlangsung (jank vs. kompromi memori)
Selain parameter ini, Anda bisa menambahkan parameter sendiri atau mengembangkan konfigurasinya sendiri.
Pengoptimalan khusus perangkat
Anda juga dapat meningkatkan performa dengan menambahkan pengoptimalan khusus perangkat.
Salin/penskalaan buffer dan dekode/enkode JPEG
Implementasi umum menggunakan CPU (libyuv/libjpeg), tetapi Anda dapat menggantinya dengan pengoptimalan spesifik per perangkat.
Format output HAL
Implementasi umum menggunakan format output berikut:
- Buffering
YUV_420_888
untuk videoIMPLEMENTATION_DEFINED
YUV12
untuk semua bufferIMPLEMENTATION_DEFINED
lainnya
Untuk meningkatkan performa, Anda dapat mengganti format output dengan format khusus perangkat format yang efisien. Anda juga dapat mendukung format tambahan dalam implementasi
Validasi
Perangkat dengan dukungan kamera eksternal harus lulus CTS kamera. USB eksternal {i>webcam<i} harus tetap dicolokkan ke perangkat tertentu selama seluruh pengujian, jika tidak, beberapa kasus pengujian akan gagal.