Android memungkinkan perangkat mendukung streaming perangkat kamera secara serentak. Sebagai contoh, hal ini memungkinkan 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 perangkat kamera yang saat ini terhubung yang mendukung konfigurasi sesi perangkat kamera secara serentak.isConcurrentSessionConfigurationSupported
: Memeriksa apakah set perangkat kamera yang disediakan dan perangkat yang konfigurasi sesi dapat dikonfigurasi secara serentak.
Kumpulan kombinasi streaming wajib yang harus didukung selama streaming serentak
streaming disertakan melalui karakteristik kamera perangkat kamera di
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
saat ini.
Setiap perangkat kamera yang diiklankan melalui getConcurrentStreamingCameraIds()
harus
mendukung konfigurasi terjamin berikut untuk streaming serentak.
Target 1 | Target 2 | |||
---|---|---|---|---|
Jenis | Ukuran maksimum | Jenis | Ukuran maksimal | Contoh kasus penggunaan |
YUV | S1440p | Pemrosesan video atau gambar dalam aplikasi | ||
PRIV | S1440p | Analisis jendela bidik dalam aplikasi | ||
JPEG | S1440p | Tidak ada pengambilan gambar diam jendela bidik | ||
YUV/PRIV | s720p | JPEG | s1440p | Pengambilan gambar diam standar |
YUV / PRIV | s720p | YUV / PRIV | S1440p | Video dalam aplikasi atau pemrosesan dengan pratinjau |
Perangkat dengan kemampuan MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
)
berisi
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
pendukung Y8 harus mendukung penggantian streaming YUV dengan Y8
kombinasi aliran data.
s720p
mengacu pada 720p (1280x720) atau resolusi maksimum yang didukung untuk
format tertentu yang
ditampilkan oleh
StreamConfigurationMap.getOutputSizes()
.
s1440p
mengacu pada 1440p (1920 x 1440) atau resolusi maksimum yang didukung untuk
format tertentu yang
ditampilkan oleh
StreamConfigurationMap.getOutputSizes()
.
Perangkat yang kemampuannya tidak mencakup
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
harus mendukung minimal satu aliran Y16, Dataspace::DEPTH
dengan resolusi
sVGA, selama operasi serentak, dengan sVGA adalah yang lebih kecil dari dua
resolusi berikut:
- resolusi output maksimum untuk format yang diberikan
- 640 x 480
Implementasi
Untuk mengizinkan aplikasi mengkueri perangkat guna menentukan apakah perangkat
kamera mendukung streaming serentak, mengimplementasikan
ICameraProvider@2.6
Antarmuka HAL, yang meliputi metode berikut:
Untuk implementasi referensi antarmuka HAL ICameraProvider@2.6
, lihat
library HAL kamera yang diemulasi di
EmulatedCameraProviderHWLImpl.cpp
.
Validasi
Untuk menguji apakah implementasi fitur ini berfungsi sebagaimana mestinya, gunakan
pengujian CTS
ConcurrentCameraTest.java
. Selain itu, uji menggunakan aplikasi yang membuka beberapa kamera dan mengoperasikannya
secara serentak.
Masalah alokasi resource
Jika HAL kamera memberitahukan dukungan untuk operasi serentak perangkat kamera, mereka mungkin mengalami masalah alokasi sumber daya, terutama di jika tersedia cukup sumber daya image signal processor (ISP) di untuk menstreaming kamera depan dan belakang (atau kamera lainnya) secara serentak, tetapi tidak kapasitas penuh mereka. Dalam hal ini, HAL kamera harus mengalokasikan ke setiap perangkat kamera.
Contoh skenario
Skenario berikut menunjukkan masalah ini.
Masalah
Perangkat memiliki konfigurasi berikut:
- ID Kamera
0
adalah kamera logis yang didukung oleh lebar dan ultra-wide yang masing-masing mengambil satu sumber daya ISP. - ID Kamera
1
adalah kamera yang menggunakan satu resource ISP.
Perangkat (ponsel) memiliki dua ISP. Jika ID kamera 0
dibuka dan sesi
dikonfigurasi, ada kemungkinan bahwa HAL kamera
menyimpan dua ISP mengantisipasi
penggunaan kamera ultrawide dan lebar.
Jika demikian, kamera depan (ID 1
) tidak dapat mengonfigurasi streaming
apa pun karena kedua ISP sedang digunakan.
Solusi
Untuk mengatasi masalah ini, framework dapat membuka ID kamera 0
dan 1
sebelum mengonfigurasi sesi untuk memberikan petunjuk ke HAL kamera tentang cara
mengallokasikan resource (karena sekarang mengharapkan operasi kamera serentak).
Namun, hal ini dapat menyebabkan keterbatasan kemampuan, misalnya, zoom mungkin tidak
mampu menangani rasio rentang zoom penuh (karena beralih kamera fisik
ID mungkin bermasalah).
Untuk menerapkan solusi ini, lakukan perubahan berikut pada
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Mengamankan bahwa untuk operasi kamera secara serentak, kamera framework harus membuka perangkat kamera (
@3.2::ICameraDevice::open
) sebelum mengonfigurasi sesi apa pun di perangkat kamera. Tindakan ini mengizinkan kamera penyedia layanan untuk mengalokasikan sumber daya yang sesuai.Untuk mengatasi masalah tidak dapat menangani rasio rentang zoom penuh, pastikan aplikasi kamera, saat menggunakan kamera secara serentak, dijamin menggunakan setelan kontrol
ZOOM_RATIO
antara 1x danMAX_DIGITAL_ZOOM
, bukanZOOM_RATIO_RANGE
lengkap (hal ini mencegah pengalihan kamera fisik secara internal, yang berpotensi memerlukan lebih banyak ISP).
Masalah dengan testDualCameraPreview
Saat Anda melakukan pembaruan di atas, hal ini dapat menciptakan masalah dengan perilaku yang diizinkan
oleh pengujian MultiViewTest.java#testDualCameraPreview
.
Pengujian testDualCameraPreview
tidak mengonfigurasi sesi hanya setelah dibuka
semua kamera. Kode tersebut mengikuti urutan berikut:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Namun, cara ini menoleransi kegagalan terbuka kamera dengan
ERROR_MAX_CAMERAS_IN_USE [1]
. Aplikasi pihak ketiga mungkin bergantung pada perilaku ini.
Karena HAL kamera tidak akan mengetahui pengaturan lengkap ID kamera yang dibuka untuk operasi serentak sebelum mengkonfigurasi sesi, akan sulit untuk mengalokasikan sumber daya perangkat keras (dengan asumsi ada persaingan untuk mereka).
Untuk mengatasi masalah ini, selain mempertahankan kompatibilitas mundur,
dan mendukung streaming serentak, 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 serentak.