يسمح Android للأجهزة بتوفير البث المتزامن لأجهزة الكاميرا. بالنسبة على سبيل المثال، يسمح ذلك للجهاز بتشغيل كل من الكاميرا الأمامية والكاميرا الخلفية في نفس الوقت. من نظام التشغيل Android 11، واجهة برمجة التطبيقات Camera2 الطرق التالية التي يمكن للتطبيقات الاتصال بها لتحديد ما إذا كانت الكاميرات تدعم البث المتزامن إعدادات البث المتوافقة
getConcurrentCameraIds
: الحصول على مجموعة مجموعات أجهزة الكاميرا المتصلة حاليًا المعرّفات التي تتيح ضبط جلسات جهاز الكاميرا بشكل متزامن.isConcurrentSessionConfigurationSupported
: تتحقّق مما إذا كانت مجموعة أجهزة الكاميرا المقدّمة ونظيرتها يمكن تهيئة عمليات تهيئة الجلسات بالتزامن.
مجموعة من مجموعات البث الإلزامية التي يجب استخدامها أثناء البث المباشر
التي يتم بثها من خلال خصائص كاميرا جهاز الكاميرا في
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
الموقع.
يجب أن يكون كل جهاز كاميرا يتم الإعلان عنه من خلال getConcurrentStreamingCameraIds()
تتيح لك الإعدادات المضمونة التالية لأحداث البث المتزامنة.
الهدف 1 | الهدف 2 | |||
---|---|---|---|---|
النوع | أقصى حجم | النوع | أقصى حجم | أمثلة على حالات الاستخدام |
يوفَن (YUV) | دقة 1440p | معالجة الفيديوهات أو الصور داخل التطبيق | ||
خاصية الخصوصية | دقة 1440p | تحليل عدسة الكاميرا داخل التطبيق | ||
JPEG | دقة 1440p | لم يتم التقاط صورة ثابتة في عدسة الكاميرا | ||
ترخيص YUV / PRIV | دقة 720p | JPEG | دقة 1440p | التصوير الثابت العادي |
ترخيص YUV / PRIV | دقة 720p | ترخيص YUV / PRIV | دقة 1440p | الفيديو أو المعالجة داخل التطبيق مع المعاينة |
الأجهزة المزوّدة بميزة "MONOCHROME
"
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
تشتمل على
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
مع دعم Y8، يجب أن يتيح استبدال مجموعات بث YUV بـ Y8 لكل أنواع
مجموعات البث.
تشير s720p
إلى 720p (1280 x 720) أو أعلى درجة دقة مسموح بها
تنسيق معين يتم عرضه بواسطة
StreamConfigurationMap.getOutputSizes()
تشير s1440p
إلى 1440p (1920 x 1440) أو أعلى درجة دقة مسموح بها
التنسيق الخاص الذي يتم إرجاعه بواسطة
StreamConfigurationMap.getOutputSizes()
الأجهزة التي لا تتضمن إمكاناتها
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
يجب أن يتوافق مع بث Y16 واحد على الأقل، Dataspace::DEPTH
مع sVGA.
أثناء التشغيل المتزامن، حيث تكون sVGA أصغر
درجات الدقة التالية:
- الحد الأقصى لدقة الإخراج للتنسيق المحدد
- 640 × 480
التنفيذ
للسماح للتطبيقات بالاستعلام عن جهاز لتحديد ما إذا كان
الكاميرات التي تتيح البث المتزامن،
ICameraProvider@2.6
واجهة HAL، والتي تشمل الطرق التالية:
للاطّلاع على التنفيذ المرجعي لواجهة ICameraProvider@2.6
HAL، يمكنك الاطّلاع على
مكتبة HAL للكاميرا التي تمت محاكاتها في
EmulatedCameraProviderHWLImpl.cpp
التحقُّق
لاختبار عمل هذه الميزة على النحو المطلوب، يُرجى استخدام
ConcurrentCameraTest.java
اختبار CTS. وكذلك، اختبِر باستخدام تطبيق يفتح عدة كاميرات ويعمل
في وقت واحد.
مشاكل توزيع الموارد
إذا كانت HALs للكاميرا تعلن عن دعم التشغيل المتزامن أجهزة الكاميرا، فقد يواجهون مشكلات في تخصيص الموارد، خاصة في الحالة التي يتوفر فيها موارد معالج إشارات الصور (ISP) على الهاتف لبث الكاميرا الأمامية والخلفية (أو غيرها) بالتزامن، ولكن لا من قدرته الكاملة. في هذه الحالة، يجب أن تخصّص طبقة تجريد الأجهزة (HAL) للكاميرا بشكل محدود الموارد المادية لكل جهاز كاميرا.
مثال على السيناريو
يوضح السيناريو التالي هذه المشكلة.
المشكلة
تم ضبط الجهاز على الإعدادات التالية:
- معرّف الكاميرا
0
هو كاميرا منطقية تستند إليها كاميرا لالتقاط صور موسّعة وفائقة الاتساع الكاميرا، ويحصل كل منها على مورد واحد لمزود خدمة الإنترنت. - معرّف الكاميرا
1
هو كاميرا تستعين بمورد واحد لمزوّد خدمة الإنترنت.
الجهاز (الهاتف) مزوّد بمزوّدَي خدمة إنترنت. في حال فتح معرّف الكاميرا 0
وكانت الجلسة
فمن المحتمل أن يحتفظ طبقة تجريد الأجهزة (HAL) للكاميرا باثنين من مزودي خدمة الإنترنت يتوقعون
استخدام الكاميرا لالتقاط صور موسّعة
وعريضة جدًا
في هذه الحالة، يتعذّر على الكاميرا الأمامية (رقم التعريف 1
) ضبط أي إعدادات.
البث نظرًا لاستخدام مزودي خدمة الإنترنت كليهما.
الحل
لحلّ هذه المشكلة، يمكن لإطار العمل فتح كلّ من معرّفَي الكاميرا 0
و1
.
قبل إعداد الجلسات لتقديم تلميح إلى طبقة تجريد الأجهزة (HAL) للكاميرا حول كيفية
تخصيص الموارد (لأنها تتوقع الآن تشغيل الكاميرات بشكل متزامن).
ومع ذلك، قد يؤدي هذا إلى إمكانات محدودة، على سبيل المثال، قد لا يكون التكبير/التصغير
قادر على التعامل مع نسبة نطاق التكبير أو التصغير (لأنّ تبديل الكاميرا الفعلية)
قد تمثّل أرقام التعريف مشاكل).
لتنفيذ هذا الحل، يمكنك إجراء التحديثات التالية على
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
وضِّح أنّ الكاميرا لإجراء التشغيل المتزامن للكاميرات يجب أن يفتح إطار العمل أجهزة الكاميرا (
@3.2::ICameraDevice::open
) قبل ضبط أي جلسات على أجهزة الكاميرا. يسمح هذا الإجراء باستخدام الكاميرا. ومزودي الخدمة بتخصيص الموارد وفقًا لذلك.لمعالجة مشكلة عدم القدرة على معالجة جميع بالنسبة إلى نطاق التكبير أو التصغير، فتأكد من أن تطبيقات الكاميرا، عند استخدام الكاميرات بشكل متزامن، نضمن لك استخدام إعداد التحكّم في
ZOOM_RATIO
بين 1x و1 فقطMAX_DIGITAL_ZOOM
بدلاً منZOOM_RATIO_RANGE
الكاملة (هذه يمنع التبديل بين الكاميرات الفيزيائية داخليًا، وهو ما يُحتمل أن يتطلب المزيد من مزودي خدمة الإنترنت).
مشكلة في testDualcameraPreview
عند إجراء التعديلات أعلاه، يمكن أن يؤدي ذلك إلى حدوث مشكلة في سلوك مسموح به.
من خلال اختبار MultiViewTest.java#testDualCameraPreview
.
لا يضبط الاختبار testDualCameraPreview
الجلسات إلا بعد الفتح.
جميع الكاميرات. وهو يتبع هذا التسلسل:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
ومع ذلك، فإنه يقبل إخفاقات فتح الكاميرا مع
ERROR_MAX_CAMERAS_IN_USE [1]
وقد تعتمد التطبيقات التابعة لجهات خارجية على هذا السلوك.
لأنّ طبقة تجريد الأجهزة (HAL) للكاميرا لن تعرف المجموعة الكاملة لمعرّفات الكاميرا المفتوحة في التشغيل المتزامن قبل إعداد الجلسات، فقد يكون من الصعب تخصيص موارد الأجهزة (على افتراض أن هناك بعض المنافسة عليها).
لحل هذه المشكلة، الحفاظ على التوافق مع الأنظمة القديمة بالإضافة إلى
إتاحة البث المتزامن، يجب ألا تجتاز HALs للكاميرا طلبات openCamera
مع
ERROR_MAX_CAMERAS_IN_USE
في حال عدم توافقهما مع إعدادات البث الكامل
تشغيل جميع الكاميرات بالتزامن.