Eşzamanlı Kamera Akışı

Android, cihazların kamera cihazlarının eşzamanlı akışını desteklemesine olanak tanır. Örneğin bu, bir cihazın hem ön hem de arka kameralarının aynı anda çalışmasına olanak tanır. Android 11'den itibaren Camera2 API, kameraların eşzamanlı akışı ve desteklenen akış yapılandırmalarını destekleyip desteklemediğini belirlemek için uygulamaların çağırabileceği aşağıdaki yöntemleri içerir.

  • getConcurrentCameraIds : Kamera cihazı oturumlarının eşzamanlı olarak yapılandırılmasını destekleyen, halihazırda bağlı olan kamera cihazı tanımlayıcılarının kombinasyon kümesini alır.
  • isConcurrentSessionConfigurationSupported : Sağlanan kamera cihazları grubunun ve bunlara karşılık gelen oturum yapılandırmalarının eşzamanlı olarak yapılandırılıp yapılandırılamayacağını kontrol eder.

Eşzamanlı akış sırasında desteklenmesi gereken bir dizi zorunlu akış kombinasyonu, SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS özelliğindeki bir kamera cihazının kamera özellikleri aracılığıyla dahil edilir.

getConcurrentStreamingCameraIds() aracılığıyla tanıtılan her kamera cihazının, eşzamanlı akışlar için aşağıdaki garantili yapılandırmaları desteklemesi gerekir.

Hedef 1 Hedef 2
Tip Maksimum boyut Tip Maksimum boyut Örnek kullanım durumları
YUV s1440p Uygulama içi video veya resim işleme
ÖZEL s1440p Uygulama içi vizör analizi
JPEG s1440p Vizörden hareketsiz görüntü yakalama yok
YUV / PRIV s720p JPEG s1440p Standart hareketsiz görüntüleme
YUV / PRIV s720p YUV / PRIV s1440p Uygulama içi video veya önizlemeli işleme

Y8'i destekleyen MONOCHROME özelliğine sahip cihazlar ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME içerir) tüm garantili akış kombinasyonlarında YUV akışlarının Y8 ile değiştirilmesini desteklemelidir.

s720p 720p (1280 x 720) veya StreamConfigurationMap.getOutputSizes() tarafından döndürülen belirli format için desteklenen maksimum çözünürlüğü ifade eder. s1440p 1440p (1920 x 1440) veya StreamConfigurationMap.getOutputSizes() tarafından döndürülen belirli format için desteklenen maksimum çözünürlüğü ifade eder. Yetenekleri ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE içermeyen cihazlar, eşzamanlı çalışma sırasında sVGA çözünürlüğüne sahip en az tek bir Y16 akışını ( Dataspace::DEPTH desteklemelidir; burada sVGA, aşağıdaki iki çözünürlükten daha küçüktür:

  • verilen format için maksimum çıktı çözünürlüğü
  • 640x480

Uygulama

Uygulamaların, kameralarının eşzamanlı akışı destekleyip desteklemediğini belirlemek amacıyla bir cihazı sorgulamasına izin vermek için aşağıdaki yöntemleri içeren ICameraProvider@2.6 HAL arayüzünü uygulayın:

ICameraProvider@2.6 HAL arayüzünün referans uygulaması için EmulatedCameraProviderHWLImpl.cpp adresindeki öykünülmüş kamera HAL kitaplığına bakın.

Doğrulama

Bu özelliği uygulamanızın amaçlandığı gibi çalıştığını test etmek için ConcurrentCameraTest.java CTS testini kullanın. Ayrıca birden fazla kamerayı açan ve bunları aynı anda çalıştıran bir uygulamayı kullanarak test edin.

Kaynak tahsisi sorunları

Kamera HAL'leri, kamera cihazlarının eşzamanlı çalışması için destek reklamı yaparsa, özellikle telefonda hem ön hem de arka (veya diğer) kameraları aynı anda yayınlamak için yeterli görüntü sinyali işlemcisi (ISP) kaynağının bulunması durumunda, kaynak tahsis sorunlarıyla karşılaşabilirler. , ancak tam kapasiteleriyle değil. Bu durumda kamera HAL'nin her kamera cihazına sınırlı donanım kaynağı ayırması gerekir.

Örnek senaryo

Aşağıdaki senaryoda bu sorun gösterilmektedir.

Sorun

Cihaz aşağıdaki konfigürasyona sahiptir:

  • Kamera Kimliği 0 , her biri bir ISP kaynağı alan geniş ve ultra geniş kamerayla desteklenen mantıksal bir kameradır.
  • Kamera Kimliği 1 bir ISP kaynağı alan bir kameradır.

Cihazın (telefon) iki ISP'si vardır. Kamera kimliği 0 açılırsa ve bir oturum yapılandırılırsa, kamera HAL'nin hem ultra geniş hem de geniş kamera kullanımını öngören iki ISP'yi ayırması mümkündür.

Durum buysa, her iki ISP de kullanımda olduğundan ön kamera (ID 1 ) herhangi bir akışı yapılandıramaz.

Çözüm

Bu sorunu çözmek için çerçeve, kamera HAL'sine kaynakların nasıl tahsis edileceğine dair bir ipucu sağlamak üzere oturumları yapılandırmadan önce hem kamera kimlikleri 0 hem de 1 açabilir (çünkü artık kameraların eşzamanlı çalışmasını beklemektedir). Ancak bu, sınırlı yeteneklere yol açabilir; örneğin yakınlaştırma, tam yakınlaştırma aralığı oranını karşılayamayabilir (çünkü fiziksel kamera kimliklerini değiştirmek sorunlu olabilir).

Bu çözümü uygulamak için, provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds için aşağıdaki güncellemeleri yapın.

  • Kameraların eş zamanlı çalışması için kamera çerçevesinin, kamera aygıtlarında herhangi bir oturumu yapılandırmadan önce kamera aygıtlarını ( @3.2::ICameraDevice::open ) açması gerektiğini zorunlu kılın. Bu, kamera sağlayıcılarının kaynakları buna göre tahsis etmesine olanak tanır.

  • Tam yakınlaştırma aralığı oranını işleyememe sorununu çözmek için, kamera uygulamalarının, kameraları aynı anda kullanırken, tam ZOOM_RATIO_RANGE yerine yalnızca 1x ile MAX_DIGITAL_ZOOM arasındaki ZOOM_RATIO kontrol ayarını kullanacağının garanti edildiğinden emin olun (bu, ZOOM_RATIO_RANGE aralığının tamamının değiştirilmesini önler). potansiyel olarak daha fazla İSS gerektiren dahili fiziksel kameralar).

testDualCameraPreview ile ilgili sorun

Yukarıdaki güncellemeleri yaptığınızda MultiViewTest.java#testDualCameraPreview testinin izin verdiği bir davranışla ilgili sorun yaratabilir.

testDualCameraPreview testi yalnızca tüm kameralar açıldıktan sonra oturumları yapılandırmaz. Bu sırayı takip eder:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Ancak ERROR_MAX_CAMERAS_IN_USE [1] ile kamera açma arızalarını tolere eder. Üçüncü taraf uygulamalar bu davranışa bağlı olabilir.

Kamera HAL'si, oturumları yapılandırmadan önce eşzamanlı işlem için açılan kamera kimliklerinin tamamını bilemeyeceğinden, donanım kaynaklarını tahsis etmesi zor olabilir (bunlar için bir miktar rekabet olduğu varsayılırsa).

Bu sorunu çözmek için, eşzamanlı akışı desteklemenin yanı sıra geriye dönük uyumluluğu da koruyan kamera HAL'leri, aynı anda çalışan tüm kameralar için tam akış yapılandırmasını destekleyemiyorlarsa, ERROR_MAX_CAMERAS_IN_USE ile openCamera çağrılarında başarısız olmalıdır.