البث المتزامن بالكاميرا

يسمح 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.6HAL، يمكنك الاطّلاع على مكتبة 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 في حال عدم توافقهما مع إعدادات البث الكامل تشغيل جميع الكاميرات بالتزامن.