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_CAPABILITIES
CameraMetadata#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.6
HAL 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 ileMAX_DIGITAL_ZOOM
arasındakiZOOM_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.