Android mengizinkan perangkat untuk mendukung streaming perangkat kamera secara bersamaan. Misalnya, hal ini memungkinkan suatu perangkat memiliki kamera depan dan belakang yang beroperasi secara bersamaan. Mulai Android 11, Camera2 API menyertakan metode berikut yang dapat dipanggil aplikasi untuk menentukan apakah kamera mendukung streaming serentak dan konfigurasi streaming yang didukung.
-
getConcurrentCameraIds
: Mendapatkan kumpulan kombinasi pengidentifikasi perangkat kamera yang saat ini terhubung yang mendukung konfigurasi sesi perangkat kamera secara bersamaan. -
isConcurrentSessionConfigurationSupported
: Memeriksa apakah kumpulan perangkat kamera yang disediakan dan konfigurasi sesi terkait dapat dikonfigurasi secara bersamaan.
Serangkaian kombinasi streaming wajib yang harus didukung selama streaming bersamaan disertakan melalui karakteristik kamera perangkat kamera di properti SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Setiap perangkat kamera yang diiklankan melalui getConcurrentStreamingCameraIds()
harus mendukung konfigurasi terjamin berikut untuk streaming serentak.
Sasaran 1 | Sasaran 2 | |||
---|---|---|---|---|
Jenis | Ukuran maksimal | Jenis | Ukuran maksimal | Contoh kasus penggunaan |
YUV | s1440p | Pemrosesan video atau gambar dalam aplikasi | ||
PRIBADI | s1440p | Analisis jendela bidik dalam aplikasi | ||
jpeg | s1440p | Tidak ada pengambilan gambar diam melalui jendela bidik | ||
YUV / PRIV | s720p | jpeg | s1440p | Pencitraan diam standar |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Video dalam aplikasi atau pemrosesan dengan pratinjau |
Perangkat dengan kemampuan MONOCHROME
( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
mencakup CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
) yang mendukung Y8 harus mendukung penggantian aliran YUV dengan Y8 di semua kombinasi aliran yang dijamin.
s720p
mengacu pada 720p (1280 x 720) atau resolusi maksimum yang didukung untuk format tertentu yang dikembalikan oleh StreamConfigurationMap.getOutputSizes()
. s1440p
mengacu pada 1440p (1920 x 1440) atau resolusi maksimum yang didukung untuk format tertentu yang dikembalikan oleh StreamConfigurationMap.getOutputSizes()
. Perangkat yang kemampuannya tidak mencakup ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
harus mendukung setidaknya satu aliran Y16, Dataspace::DEPTH
dengan resolusi sVGA, selama pengoperasian bersamaan, dengan sVGA lebih kecil dari dua resolusi berikut:
- resolusi keluaran maksimum untuk format tertentu
- 640x480
Penerapan
Untuk mengizinkan aplikasi menanyakan perangkat guna menentukan apakah kameranya mendukung streaming serentak, terapkan antarmuka ICameraProvider@2.6
HAL, yang mencakup metode berikut:
Untuk implementasi referensi antarmuka HAL ICameraProvider@2.6
, lihat pustaka HAL kamera yang ditiru di EmulatedCameraProviderHWLImpl.cpp
.
Validasi
Untuk menguji apakah penerapan fitur ini berfungsi sebagaimana mestinya, gunakan pengujian CTS ConcurrentCameraTest.java
. Selain itu, uji menggunakan aplikasi yang membuka beberapa kamera dan mengoperasikannya secara bersamaan.
Masalah alokasi sumber daya
Jika HAL kamera mengiklankan dukungan untuk pengoperasian perangkat kamera secara bersamaan, perangkat tersebut mungkin mengalami masalah alokasi sumber daya, terutama jika terdapat cukup sumber daya prosesor sinyal gambar (ISP) di ponsel untuk melakukan streaming kamera depan dan belakang (atau lainnya) secara bersamaan. , namun tidak mencapai kapasitas penuhnya. Dalam hal ini, kamera HAL harus mengalokasikan sumber daya perangkat keras yang terbatas ke setiap perangkat kamera.
Contoh skenario
Skenario berikut menunjukkan masalah ini.
Masalah
Perangkat ini memiliki konfigurasi berikut:
- Camera ID
0
adalah kamera logis yang didukung oleh kamera lebar dan ultra lebar, yang masing-masing memerlukan satu sumber daya ISP. - Camera ID
1
adalah kamera yang mengambil satu resource ISP.
Perangkat (telepon) memiliki dua ISP. Jika ID kamera 0
dibuka dan sesi dikonfigurasi, kamera HAL mungkin mencadangkan dua ISP yang mengantisipasi penggunaan kamera ultrawide dan lebar.
Jika demikian, kamera depan (ID 1
) tidak dapat mengonfigurasi streaming apa pun karena kedua ISP sedang digunakan.
Larutan
Untuk mengatasi masalah ini, kerangka kerja dapat membuka ID kamera 0
dan 1
sebelum mengonfigurasi sesi untuk memberikan petunjuk kepada HAL kamera tentang cara mengalokasikan sumber daya (karena sekarang mengharapkan pengoperasian kamera secara bersamaan). Namun, hal ini dapat menyebabkan terbatasnya kemampuan, misalnya, zoom mungkin tidak mampu menangani rasio rentang zoom penuh (karena mengganti ID kamera fisik mungkin menimbulkan masalah).
Untuk menerapkan solusi ini, lakukan pembaruan berikut pada provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Mengamanatkan bahwa untuk pengoperasian kamera secara bersamaan, kerangka kamera harus membuka perangkat kamera (
@3.2::ICameraDevice::open
) sebelum mengonfigurasi sesi apa pun pada perangkat kamera. Hal ini memungkinkan penyedia kamera untuk mengalokasikan sumber daya yang sesuai.Untuk mengatasi masalah tidak mampu menangani rasio rentang zoom penuh, pastikan bahwa aplikasi kamera, saat menggunakan kamera secara bersamaan, dijamin menggunakan pengaturan kontrol
ZOOM_RATIO
antara hanya 1x danMAX_DIGITAL_ZOOM
dan bukanZOOM_RATIO_RANGE
yang lengkap (hal ini mencegah peralihan kamera fisik secara internal, yang berpotensi memerlukan lebih banyak ISP).
Masalah dengan testDualCameraPreview
Saat Anda melakukan pembaruan di atas, hal ini dapat menimbulkan masalah pada perilaku yang diizinkan oleh pengujian MultiViewTest.java#testDualCameraPreview
.
Tes testDualCameraPreview
tidak mengonfigurasi sesi hanya setelah membuka semua kamera. Ini mengikuti urutan ini:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Namun, ia mentolerir kegagalan pembukaan kamera dengan ERROR_MAX_CAMERAS_IN_USE [1]
. Aplikasi pihak ketiga mungkin bergantung pada perilaku ini.
Karena HAL kamera tidak akan mengetahui set lengkap ID kamera yang dibuka untuk operasi bersamaan sebelum mengonfigurasi sesi, mungkin sulit untuk mengalokasikan sumber daya perangkat keras (dengan asumsi ada persaingan untuk hal tersebut).
Untuk mengatasi masalah ini, menjaga kompatibilitas ke belakang selain mendukung streaming bersamaan, HAL kamera harus menggagalkan panggilan openCamera
dengan ERROR_MAX_CAMERAS_IN_USE
jika tidak dapat mendukung konfigurasi streaming penuh untuk semua kamera yang berjalan secara bersamaan.