Android, cihazların kamera cihazlarının eşzamanlı akışını desteklemesine olanak tanır. Örneğin bu, bir cihazın hem ön hem de arka kameralarının aynı anda çalışmasına olanak tanır. Android 11'den itibaren Camera2 API, kameraların eşzamanlı akışı ve desteklenen akış yapılandırmalarını destekleyip desteklemediğini 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, halihazırda bağlı olan kamera cihazı tanımlayıcılarının kombinasyon kümesini alır. -
isConcurrentSessionConfigurationSupported
: Sağlanan kamera cihazları 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ı akış sırasında desteklenmesi gereken bir dizi zorunlu akış kombinasyonu, SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
özelliğindeki bir kamera cihazının kamera özellikleri aracılığıyla dahil edilir.
getConcurrentStreamingCameraIds()
aracılığıyla tanıtılan her kamera cihazının, eşzamanlı akışlar için aşağıdaki garantili yapılandırmaları desteklemesi gerekir.
Hedef 1 | Hedef 2 | |||
---|---|---|---|---|
Tip | Maksimum boyut | Tip | Maksimum boyut | Örnek kullanım durumları |
YUV | s1440p | Uygulama içi video veya resim işleme | ||
ÖZEL | s1440p | Uygulama içi vizör analizi | ||
JPEG | s1440p | Vizörden 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 |
Y8'i destekleyen MONOCHROME
özelliğine sahip cihazlar ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
içerir) 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 format için desteklenen maksimum çözünürlüğü ifade eder. s1440p
1440p (1920 x 1440) veya StreamConfigurationMap.getOutputSizes()
tarafından döndürülen belirli format için desteklenen maksimum çözünürlüğü ifade eder. Yetenekleri ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
içermeyen cihazlar, eşzamanlı çalışma sırasında sVGA çözünürlüğüne sahip en az tek bir Y16 akışını ( Dataspace::DEPTH
desteklemelidir; burada sVGA, aşağıdaki iki çözünürlükten daha küçüktür:
- verilen format için maksimum çıktı çözünürlüğü
- 640x480
Uygulama
Uygulamaların, kameralarının eşzamanlı akışı destekleyip desteklemediğini belirlemek amacıyla bir cihazı sorgulamasına izin vermek için 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 öykünülmüş kamera HAL kitaplığına bakın.
Doğrulama
Bu özelliği 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ı aynı anda çalıştıran bir uygulamayı kullanarak test edin.
Kaynak tahsisi sorunları
Kamera HAL'leri, kamera cihazlarının eşzamanlı çalışması için destek reklamı yaparsa, özellikle telefonda hem ön hem de arka (veya diğer) kameraları aynı anda yayınlamak için yeterli görüntü sinyali işlemcisi (ISP) kaynağının bulunması durumunda, kaynak tahsis sorunlarıyla karşılaşabilirler. , ancak tam kapasiteleriyle değil. Bu durumda kamera HAL'nin her kamera cihazına sınırlı donanım kaynağı ayırması gerekir.
Örnek senaryo
Aşağıdaki senaryoda bu sorun gösterilmektedir.
Sorun
Cihaz aşağıdaki konfigürasyona sahiptir:
- Kamera Kimliği
0
, her biri bir ISP kaynağı alan geniş ve ultra geniş kamerayla desteklenen mantıksal bir kameradır. - Kamera Kimliği
1
bir ISP kaynağı alan bir kameradır.
Cihazın (telefon) iki ISP'si vardır. Kamera kimliği 0
açılırsa ve bir oturum yapılandırılırsa, kamera HAL'nin hem ultra geniş hem de geniş kamera kullanımını öngören iki ISP'yi ayırması mümkündür.
Durum buysa, her iki ISP de kullanımda olduğundan ön kamera (ID 1
) herhangi bir akışı yapılandıramaz.
Çözüm
Bu sorunu çözmek için çerçeve, kamera HAL'sine kaynakların nasıl tahsis edileceğine dair bir ipucu sağlamak üzere oturumları yapılandırmadan önce hem kamera kimlikleri 0
hem de 1
açabilir (çünkü artık kameraların eşzamanlı çalışmasını beklemektedir). Ancak bu, sınırlı yeteneklere yol açabilir; örneğin yakınlaştırma, tam yakınlaştırma aralığı oranını karşılayamayabilir (çünkü fiziksel kamera kimliklerini değiştirmek sorunlu olabilir).
Bu çözümü uygulamak için, provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
için aşağıdaki güncellemeleri yapın.
Kameraların eş zamanlı çalışması için kamera çerçevesinin, kamera aygıtlarında herhangi bir oturumu yapılandırmadan önce kamera aygıtlarını (
@3.2::ICameraDevice::open
) açması gerektiğini zorunlu kılın. Bu, kamera sağlayıcılarının kaynakları buna göre tahsis etmesine olanak tanır.Tam yakınlaştırma aralığı oranını işleyememe sorununu çözmek için, kamera uygulamalarının, kameraları aynı anda kullanırken, tam ZOOM_RATIO_RANGE yerine yalnızca 1x ile
MAX_DIGITAL_ZOOM
arasındakiZOOM_RATIO
kontrol ayarını kullanacağının garanti edildiğinden emin olun (bu,ZOOM_RATIO_RANGE
aralığının tamamının değiştirilmesini önler). potansiyel olarak daha fazla İSS gerektiren dahili fiziksel kameralar).
testDualCameraPreview ile ilgili sorun
Yukarıdaki güncellemeleri yaptığınızda MultiViewTest.java#testDualCameraPreview
testinin izin verdiği bir davranışla ilgili sorun yaratabilir.
testDualCameraPreview
testi yalnızca tüm kameralar açıldıktan sonra oturumları yapılandırmaz. Bu sırayı takip eder:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Ancak ERROR_MAX_CAMERAS_IN_USE [1]
ile kamera açma arızalarını tolere eder. Üçüncü taraf uygulamalar bu davranışa bağlı olabilir.
Kamera HAL'si, oturumları yapılandırmadan önce eşzamanlı işlem için açılan kamera kimliklerinin tamamını bilemeyeceğinden, donanım kaynaklarını tahsis etmesi zor olabilir (bunlar için bir miktar rekabet olduğu varsayılırsa).
Bu sorunu çözmek için, eşzamanlı akışı desteklemenin yanı sıra geriye dönük uyumluluğu da koruyan kamera HAL'leri, aynı anda çalışan tüm kameralar için tam akış yapılandırmasını destekleyemiyorlarsa, ERROR_MAX_CAMERAS_IN_USE
ile openCamera
çağrılarında başarısız olmalıdır.