Eşzamanlı kamera görüntü akışı

Android, cihazların kamera cihazlarının eşzamanlı yayınını desteklemesine olanak tanır. Örneğin, bu sayede bir cihazda hem ön hem de arka kamera aynı anda çalışabilir. Android 11'den itibaren Camera2 API, kameraların eşzamanlı yayını destekleyip desteklemediğini ve desteklenen yayın yapılandırmalarını 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, şu anda bağlı kamera cihazı tanımlayıcılarının kombinasyonlarını alır.
  • isConcurrentSessionConfigurationSupported: Sağlanan kamera cihazı 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ı yayın sırasında desteklenmesi gereken zorunlu bir dizi yayın kombinasyonu, kamera cihazının kamera özellikleri aracılığıyla SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS mülküne dahil edilir.

getConcurrentStreamingCameraIds() üzerinden reklamı yapılan her kamera cihazı, eşzamanlı yayınlar için aşağıdaki garanti edilen yapılandırmaları desteklemelidir.

Hedef 1 Hedef 2
Tür Maksimum boyut Tür Maksimum boyut Örnek kullanım alanları
YUV s1440p Uygulama içi video veya resim işleme
PRIV s1440p Uygulama içi vizör analizi
JPEG s1440p Vizörden fotoğraf çekme özelliği yok
YUV / PRIV s720p JPEG s1440p Standart hareketsiz görüntüleme
YUV / PRIV s720p YUV / PRIV s1440p Uygulama içi video veya önizlemeyle işleme

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

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

  • Belirtilen biçim için maksimum çıkış çözünürlüğü
  • 640 x 480

Uygulama

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

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

Doğrulama

Bu özelliğin 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ı eş zamanlı olarak çalıştıran bir uygulama kullanarak da test yapın.

Kaynak tahsisi sorunları

Kamera HAL'leri, kamera cihazlarının eşzamanlı çalışması için destek sunduğunu belirtiyorsa özellikle telefonda hem ön hem de arka (veya diğer) kameraların eşzamanlı olarak yayın yapması için yeterli görüntü sinyali işlemcisi (ISP) kaynağı olmasına rağmen tam kapasitede yayın yapılamadığında kaynak ayırma sorunlarıyla karşılaşabilir. Bu durumda kamera HAL'i her kamera cihazına sınırlı donanım kaynakları ayırmalıdır.

Örnek senaryo

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

Sorun

Cihazın yapılandırması aşağıdaki gibidir:

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

Cihazın (telefon) iki ISS'si var. 0 kamera kimliği açılır ve bir oturum yapılandırılırsa kamera HAL'i hem ultra geniş hem de geniş kamera kullanımını öngörerek iki ISP ayırabilir.

Bu durumda, her iki İSS de kullanıldığı için ön kamera (1 kimliği) hiçbir yayını yapılandıramaz.

Çözüm

Bu sorunu gidermek için çerçeve, oturumları yapılandırmadan önce hem 0 hem de 1 kamera kimliklerini açarak kamera HAL'e kaynakları nasıl ayıracağıyla ilgili bir ipucu verebilir (çünkü artık kameraların eşzamanlı çalışmasını bekler). Ancak bu durum, sınırlı özelliklere neden olabilir. Örneğin, yakınlaştırma, fiziksel kamera kimliklerini değiştirmek sorunlu olabileceğinden tam yakınlaştırma aralığı oranını işleyemeyebilir.

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

  • Kameraların eşzamanlı çalışması için kamera çerçevesinin, kamera cihazlarındaki oturumları yapılandırmadan önce kamera cihazlarını (@3.2::ICameraDevice::open) açması gerektiğini zorunlu kılın. Bu sayede kamera sağlayıcılar kaynakları buna göre ayırabilir.

  • Tam yakınlaştırma aralığı oranını kullanamama sorununu gidermek için kamera uygulamaları, kameralar eşzamanlı olarak kullanıldığında ZOOM_RATIO_RANGE aralığının tamamı yerine yalnızca 1x ile MAX_DIGITAL_ZOOM arasındaki ZOOM_RATIO kontrol ayarını kullandığından emin olun (bu, fiziksel kameraların dahili olarak değiştirilmesini önler ve daha fazla ISP'nin kullanılmasını gerektirebilir).

testDualCameraPreview ile ilgili sorun

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

testDualCameraPreview testi, oturumları yalnızca tüm kameralar açıldıktan sonra yapılandırmıyor. Bu sıra şu şekildedir:

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

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

Kamera HAL'i, oturumları yapılandırmadan önce eşzamanlı çalışma için açılan kamera kimliklerinin tamamını bilmediği için donanım kaynaklarını ayırması zor olabilir (bu kaynaklar için bir rekabet olduğu varsayılır).

Bu sorunu gidermek için, eşzamanlı yayını desteklemenin yanı sıra geriye dönük uyumluluğu da koruyan kamera HAL'leri, eşzamanlı olarak çalışan tüm kameralar için tam akış yapılandırmasını destekleyemiyorsa openCamera çağrılarını ERROR_MAX_CAMERAS_IN_USE ile reddetmelidir.