Eş zamanlı kamera yayını

Android, cihazların kamera cihazlarının eşzamanlı olarak yayınlanması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, uygulamaların kameraların eşzamanlı akışı destekleyip desteklemediğini ve desteklenen akış yapılandırmalarını belirlemek için ç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ı olan kamera cihazı tanımlayıcılarının kombinasyonlarını alır.
  • isConcurrentSessionConfigurationSupported: Sağlanan kamera cihazları kümesinin 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 yayın kombinasyonları, kamera cihazının kamera özellikleriyle SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS özelliği üzerinden sağlanır.

getConcurrentStreamingCameraIds() üzerinden reklamı yapılan her kamera cihazı, eşzamanlı akışlar 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 görüntü işleme
PRIV s1440p Uygulama içi vizör analizi
JPEG s1440p Vizörde 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

MONOCHROME özelliğine sahip cihazlar (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES dahil CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) Y8'i destekleyen cihazlar, 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 biçim için desteklenen maksimum çözünürlüğü ifade eder. s1440p, 1440p (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 tek bir Y16 akışını (Dataspace::DEPTH) desteklemelidir. Bu akış, sVGA çözünürlüğünde olmalıdır. sVGA, aşağıdaki iki çözünürlükten daha küçüğüdür:

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

Uygulama

Uygulamaların, kameralarının eşzamanlı akışı destekleyip desteklemediğini belirlemek için bir cihaza sorgu göndermesine 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 emüle edilmiş kamera HAL kitaplığına bakın.

Doğrulama

Bu özelliği uygulamanızın beklendiği gibi çalıştığını test etmek için ConcurrentCameraTest.java CTS testini kullanın. Ayrıca, birden fazla kamerayı açıp aynı anda çalıştıran bir uygulamayla da test edin.

Kaynak ayırma sorunları

Kamera HAL'leri, kamera cihazlarının eşzamanlı çalışmasını desteklediğini duyuruyorsa kaynak ayırma sorunlarıyla karşılaşabilir. Bu durum özellikle telefonda hem ön hem de arka (veya diğer) kameraları eşzamanlı olarak yayınlamak için yeterli görüntü sinyali işlemcisi (ISP) kaynağı varken bu kameraları tam kapasiteyle kullanmak için yeterli kaynak olmadığında ortaya çıkar. Bu durumda, kamera HAL'ı her kamera cihazına sınırlı donanım kaynakları ayırmalıdır.

Örnek senaryo

Aşağıdaki senaryo bu sorunu göstermektedir.

Sorun

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

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

Cihazda (telefon) iki İSS var. Kamera kimliği 0 açılır ve bir oturum yapılandırılırsa kamera HAL'sinin hem ultra geniş hem de geniş kamera kullanımını öngörerek iki ISP ayırdığı olabilir.

Bu durumda, her iki ISP de kullanıldığı için ön kamera (kimlik 1) herhangi bir akışı yapılandıramaz.

Çözüm

Bu sorunu gidermek için çerçeve, oturumları yapılandırmadan önce hem kamera kimliklerini 0 hem de 1 açabilir. Bu sayede, kaynakların nasıl ayrılacağı konusunda kamera HAL'ına ipucu verilir (çünkü artık kameraların eşzamanlı çalışması beklenir). Ancak bu durum, sınırlı özelliklere yol açabilir. Örneğin, yakınlaştırma özelliği tam yakınlaştırma aralığı oranını işleyemeyebilir (çünkü fiziksel kamera kimliklerini değiştirmek sorunlu olabilir).

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ında herhangi bir oturum yapılandırmadan önce kamera cihazlarını (@3.2::ICameraDevice::open) açması zorunlu kılınır. Bu sayede kamera sağlayıcılar kaynakları buna göre ayırabilir.

  • Tam yakınlaştırma aralığı oranının işlenememesi sorununu gidermek için kamera uygulamalarının, kameraları eşzamanlı olarak kullanırken tam ZOOM_RATIO_RANGE yerine yalnızca 1x ile MAX_DIGITAL_ZOOM arasında ZOOM_RATIO kontrol ayarını kullandığından emin olun (Bu, fiziksel kameraların dahili olarak değiştirilmesini önler ve bu da potansiyel olarak daha fazla ISP gerektirir).

testDualCameraPreview ile ilgili sorun

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

Test testDualCameraPreview, oturumları yalnızca tüm kameralar açıldıktan sonra yapılandırmıyor. Bu işlem şu sırayla yapılır:

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

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

Oturumlar yapılandırılmadan önce kamera HAL'ı, eşzamanlı işlem için açılan kamera kimliklerinin tamamını bilmeyeceğinden donanım kaynaklarını ayırması zor olabilir (kaynaklar için rekabet olduğunu varsayarsak).

Bu sorunu çözmek için eşzamanlı akış desteklemenin yanı sıra geriye dönük uyumluluğu da korumak gerekir. Bu nedenle, eşzamanlı olarak çalışan tüm kameralar için tam akış yapılandırmasını destekleyemeyen kamera donanım soyutlama katmanları, openCamera çağrılarını ERROR_MAX_CAMERAS_IN_USE ile başarısız kılmalıdır.