Android, cihazların kamera cihazlarının eşzamanlı akışını desteklemesine izin verir. Örneğin, Örneğin, bir cihazda hem ön hem arka kameralar kullanılabilir. ile aynı anda oynatabilirsiniz. Android 11'den Camera2 API'si aşağıdaki yöntemleri içerir: kameraların eşzamanlı akışı destekleyip desteklemediğini belirlemek için telefon edip desteklenen akış yapılandırmaları.
getConcurrentCameraIds
: Şu anda bağlı olan kamera cihazının kombinasyon grubunu alır kamera cihazı oturumlarını eşzamanlı olarak yapılandırmayı destekleyen tanımlayıcılarisConcurrentSessionConfigurationSupported
: Sağlanan kamera cihazı grubunun ve bunlara karşılık gelen cihazların olup olmadığını kontrol eder. eşzamanlı olarak yapılandırılabilir.
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()
reklamı yapılan her kamera cihazı şu koşulları karşılamalıdır:
, eşzamanlı yayınlar için aşağıdaki garanti edilen yapılandırmaları destekler.
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 görüntüleme devam ediyor |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Önizlemeli uygulama içi video veya işleme |
MONOCHROME
özelliğine sahip cihazlar
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
)
içerir
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
Y8 desteği, tüm garantili seçeneklerde Y8 akışlarının Y8 ile değiştirilmesini desteklemelidir
akış kombinasyonlarını kullanabilirsiniz.
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 bir cihazı sorgulayarak cihazın
eşzamanlı akışı desteklemesi durumunda
ICameraProvider@2.6
Aşağıdaki yöntemleri içeren HAL arayüzü:
ICameraProvider@2.6
HAL arayüzünün referans uygulaması için bkz.
emülasyonlu kamera HAL kitaplığını,
EmulatedCameraProviderHWLImpl.cpp
Doğrulama
Bu özelliği uygulamanızın istenen şekilde çalışıp çalışmadığını test etmek için
ConcurrentCameraTest.java
CTS testi. Ayrıca, birden fazla kamerayı açan ve aynı anda çalıştıran bir uygulama kullanarak da test yapın.
Kaynak ayırma sorunları
Kamera HAL'lerinde, cihazın eşzamanlı çalışma çalışırken, özellikle de kaynak ayırma sorunlarıyla karşılaşabilirler. web sitesinde yeterli görüntü sinyali işlemci (İSS) kaynağının aynı anda hem ön hem de arka (veya diğer) kameraların görüntüsünü oynatabilir, ancak olduğunu varsayalım. 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 İSS kaynağı alan bir kameradır.
Cihazın (telefon) iki İSS'si olmalıdır. 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 ön kamera (kimlik: 1
)
kullanılabilmesini sağlar.
Çözüm
Çerçeve, bu sorunu çözmek için hem 0
hem de 1
kamera kimliklerini açabilir.
yapılandırmanın nasıl gerçekleşeceği konusunda kamera HAL'sine bir ipucu
(artık kameraların eşzamanlı çalışmasını beklediği için) kaynak ayırma.
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 aşağıdaki güncellemeleri yapın:
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
Kameraların eşzamanlı çalışması için kameranın çerçeve, başlamadan önce kamera cihazlarını (
@3.2::ICameraDevice::open
) açmalıdır tüm oturumları yapılandırdığınızdan emin olun. Bu, kameranın sağlayıcıların kaynakları uygun şekilde dağıtmasını sağlamak önemlidir.Projenin tamamını teslim edememe yakınlaştırma aralığı oranına dikkat edin. Kamera uygulamaları, kameraları aynı anda kullanırken
ZOOM_RATIO
kontrol ayarını yalnızca 1x ve TamZOOM_RATIO_RANGE
yerineMAX_DIGITAL_ZOOM
(bu fiziksel kameraların dahili geçişini engeller; bu da şirket 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 açıldıktan sonra yapılandırmaz
tüm kameralarda. Bu adım şu sırayı izler:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Bununla birlikte, arka plandaki özel efektlerle
ERROR_MAX_CAMERAS_IN_USE [1]
Üçü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.