Streaming Kamera Bersamaan

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 dan MAX_DIGITAL_ZOOM dan bukan ZOOM_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.