Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
Platform Android mendukung penggunaan kamera USB plug-and-play (yaitu, webcam) menggunakan Android Camera2 API standar dan antarmuka HAL kamera. Webcam umumnya mendukung driver kelas video USB (UVC) dan di Linux, driver Video4Linux (V4L) standar digunakan untuk mengontrol kamera UVC.
Dengan dukungan untuk webcam, perangkat dapat digunakan dalam kasus penggunaan ringan seperti obrolan video dan kios foto. Fitur ini tidak menggantikan HAL kamera internal umum di ponsel Android dan tidak dirancang untuk mendukung tugas kompleks yang memerlukan performa tinggi yang melibatkan streaming beresolusi tinggi dan berkecepatan tinggi, AR, dan kontrol ISP/sensor/lensa manual.
Proses HAL kamera USB adalah bagian dari penyedia kamera eksternal yang memproses ketersediaan perangkat USB dan menghitung perangkat kamera eksternal. Proses ini memiliki izin dan kebijakan SE yang mirip dengan proses HAL kamera bawaan. Aplikasi webcam pihak ketiga yang berkomunikasi langsung dengan perangkat USB memerlukan izin kamera yang sama untuk mengakses perangkat UVC seperti halnya aplikasi kamera biasa.
Contoh dan sumber
Untuk mengetahui informasi selengkapnya tentang cara mengimplementasikan kamera USB, lihat implementasi referensi penyedia kamera eksternal di
ExternalCameraProvider.
Implementasi perangkat dan sesi kamera eksternal disertakan dalam
ExternalCameraDevice
dan
ExternalCameraDeviceSession.
Mulai API level 28, Java client API menyertakan
EXTERNAL
level hardware.
Penerapan
Implementasi harus mendukung fitur sistem
android.hardware.usb.host.
Dukungan kernel untuk perangkat UVC juga harus diaktifkan. Anda dapat mengaktifkannya dengan menambahkan kode berikut 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.xmlTambahkan 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 passthrough Treble, update
sepolicysehinggacameraserverdapat 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 ukuran gambar dan kecepatan frame yang didukung
- Jumlah buffer inflight (tradeoff jank vs memori)
Selain parameter ini, Anda dapat menambahkan parameter sendiri atau mengembangkan konfigurasi sendiri.
Pengoptimalan khusus perangkat
Anda juga dapat meningkatkan performa dengan menambahkan pengoptimalan khusus perangkat.
Salinan/penskalaan buffer dan decode/encode JPEG
Implementasi generik menggunakan CPU (libyuv/libjpeg), tetapi Anda dapat menggantinya dengan pengoptimalan khusus perangkat.
Format output HAL
Implementasi generik menggunakan format output berikut:
YUV_420_888untuk bufferIMPLEMENTATION_DEFINEDvideoYUV12untuk semua bufferIMPLEMENTATION_DEFINEDlainnya
Untuk meningkatkan performa, Anda dapat mengganti format output dengan format efisien khusus perangkat. Anda juga dapat mendukung format tambahan dalam implementasi yang disesuaikan
Validasi
Perangkat dengan dukungan kamera eksternal harus lulus CTS kamera. Webcam USB eksternal harus tetap terhubung ke perangkat tertentu selama seluruh pengujian, jika tidak, beberapa kasus pengujian akan gagal.