Android memungkinkan perangkat mendukung streaming serentak perangkat kamera. Misalnya, hal ini memungkinkan perangkat mengoperasikan kamera depan dan belakang secara bersamaan. Mulai Android 11, Camera2 API mencakup metode berikut yang dapat dipanggil aplikasi untuk menentukan apakah kamera mendukung streaming serentak dan konfigurasi streaming yang didukung.
getConcurrentCameraIds
: Mendapatkan kumpulan kombinasi ID perangkat kamera yang terhubung saat ini yang mendukung konfigurasi sesi perangkat kamera secara serentak.isConcurrentSessionConfigurationSupported
: Memeriksa apakah set perangkat kamera yang diberikan dan konfigurasi sesi yang sesuai dapat dikonfigurasi secara serentak.
Serangkaian kombinasi streaming wajib yang harus didukung selama streaming serentak 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.
Target 1 | Target 2 | |||
---|---|---|---|---|
Jenis | Ukuran maksimal | 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 statis jendela bidik | ||
YUV / PRIV | s720p | JPEG | s1440p | Gambar 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 streaming YUV dengan Y8 dalam semua kombinasi streaming yang dijamin.
s720p
mengacu pada 720p (1280 x 720) 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 resolusi yang lebih kecil dari dua resolusi berikut:
- resolusi output maksimum untuk format tertentu
- 640 x 480
Implementasi
Untuk mengizinkan aplikasi mengkueri perangkat guna menentukan apakah kameranya mendukung streaming serentak, terapkan antarmuka HAL ICameraProvider@2.6
, yang mencakup metode berikut:
Untuk mengetahui penerapan referensi antarmuka HAL ICameraProvider@2.6
, lihat library HAL kamera yang diemulasi di EmulatedCameraProviderHWLImpl.cpp
.
Validasi
Untuk menguji apakah penerapan fitur ini berfungsi sebagaimana mestinya, gunakan tes CTS
ConcurrentCameraTest.java
. Selain itu, lakukan pengujian menggunakan aplikasi yang membuka beberapa kamera dan mengoperasikannya secara bersamaan.
Masalah alokasi resource
Jika HAL kamera mengiklankan dukungan untuk operasi serentak perangkat kamera, HAL tersebut mungkin mengalami masalah alokasi resource, terutama jika ada cukup resource prosesor sinyal gambar (ISP) di ponsel untuk melakukan streaming kamera depan dan belakang (atau kamera lain) secara serentak, tetapi tidak dengan kapasitas penuhnya. Dalam hal ini, HAL kamera harus mengalokasikan resource hardware yang terbatas 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 kamera lebar dan ultrawide, yang masing-masing menggunakan satu resource ISP. - ID Kamera
1
adalah kamera yang menggunakan satu resource ISP.
Perangkat (ponsel) memiliki dua ISP. Jika ID kamera 0
dibuka dan sesi dikonfigurasi, HAL kamera dapat mencadangkan dua ISP untuk mengantisipasi penggunaan kamera ultrawide dan wide.
Jika demikian, kamera depan (ID 1
) tidak dapat mengonfigurasi
streaming karena kedua ISP sedang digunakan.
Solusi
Untuk mengatasi masalah ini, framework dapat membuka ID kamera 0
dan 1
sebelum mengonfigurasi sesi untuk memberikan petunjuk kepada HAL kamera tentang cara
mengalokasikan resource (karena kini mengharapkan operasi kamera serentak).
Namun, hal ini dapat menyebabkan kemampuan terbatas, misalnya, zoom mungkin tidak dapat menangani rasio rentang zoom penuh (karena mengganti ID kamera fisik mungkin bermasalah).
Untuk menerapkan solusi ini, lakukan pembaruan berikut pada
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Mewajibkan bahwa untuk pengoperasian kamera secara serentak, framework kamera harus membuka perangkat kamera (
@3.2::ICameraDevice::open
) sebelum mengonfigurasi sesi apa pun di perangkat kamera. Dengan demikian, penyedia kamera dapat mengalokasikan resource dengan tepat.Untuk mengatasi masalah tidak dapat menangani rasio rentang zoom penuh, pastikan aplikasi kamera, saat menggunakan kamera secara bersamaan, dijamin menggunakan setelan kontrol
ZOOM_RATIO
antara 1x danMAX_DIGITAL_ZOOM
saja, bukanZOOM_RATIO_RANGE
lengkap (hal ini mencegah peralihan kamera fisik secara internal, yang berpotensi memerlukan lebih banyak ISP).
Masalah pada testDualCameraPreview
Saat Anda melakukan pembaruan di atas, masalah dapat terjadi dengan perilaku yang diizinkan oleh pengujian MultiViewTest.java#testDualCameraPreview
.
testDualCameraPreview
pengujian tidak mengonfigurasi sesi hanya setelah membuka
semua kamera. Urutannya adalah sebagai berikut:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Namun, aplikasi ini mentoleransi kegagalan pembukaan kamera dengan
ERROR_MAX_CAMERAS_IN_USE [1]
. Aplikasi pihak ketiga mungkin bergantung pada perilaku ini.
Karena HAL kamera tidak akan mengetahui kumpulan lengkap ID kamera yang dibuka untuk operasi serentak sebelum mengonfigurasi sesi, HAL kamera mungkin sulit mengalokasikan resource hardware (dengan asumsi ada beberapa persaingan untuk resource tersebut).
Untuk mengatasi masalah ini, selain mempertahankan kompatibilitas mundur dan mendukung streaming serentak, HAL kamera harus gagal memanggil openCamera
dengan ERROR_MAX_CAMERAS_IN_USE
jika tidak dapat mendukung konfigurasi streaming penuh untuk semua kamera yang berjalan secara serentak.