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

Android, cihazların kamera cihazlarının eşzamanlı akışını desteklemesine izin verir. Örneğin, bu sayede bir cihazda hem ön hem de arka kamera aynı anda çalışabilir. Android 11'den itibaren Camera2 API'sinde, kameraların eşzamanlı akışı destekleyip desteklemediğini ve desteklenen akış yapılandırmalarını destekleyip desteklemediğini belirlemek için çağırabileceği aşağıdaki yöntemler bulunur.

  • 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 akış kombinasyonu grubu, kamera cihazının kamera özellikleri aracılığıyla SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS mülküne dahil edilir.

getConcurrentStreamingCameraIds() aracılığıyla 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 Önizlemeli uygulama içi video veya 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. Özellikleri ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE içermeyen cihazlar, eşzamanlı çalışma sırasında en az bir Y16 akışını (sVGA çözünürlüklü Dataspace::DEPTH) desteklemelidir. Burada sVGA, aşağıdaki iki çözünürlükden 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 edin.

Kaynak ayırma 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 yapamadığında kaynak ayırma sorunlarıyla karşılaşabilir. Bu durumda, kamera HAL'si her bir 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 İSS kaynağı alan bir kameradır.

Cihazın (telefon) iki ISP'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ığından ön kamera (kimlik: 1) akışları 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'ine kaynakları nasıl ayıracağıyla ilgili bir ipucu verebilir (çünkü artık kameraların eşzamanlı çalışmasını bekler). Ancak bu, özelliklerin sınırlı olmasına yol açabilir. Örneğin, yakınlaştırma, tam yakınlaştırma aralığı oranını işleyemeyebilir (çünkü fiziksel kamera kimliklerinin değiştirilmesi sorun yaratabilir).

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ı işleyememe sorununu çözmek için kamera uygulamalarında, kameraları aynı anda kullanırken ZOOM_RATIO_RANGE kontrol ayarının tamamı yerine yalnızca 1x ile MAX_DIGITAL_ZOOM arasında ZOOM_RATIO kontrol ayarının kullanılacağından emin olun (bu durum fiziksel kameraların dahili olarak geçişini engeller ve bu da daha fazla İSS gerektirir).

testDualKameraPreview 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.