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_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.
Ö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.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 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 ileMAX_DIGITAL_ZOOM
arasındaZOOM_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.