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

يتيح نظام Android للأجهزة بث محتوى أجهزة الكاميرا بشكل متزامن. على سبيل المثال، يتيح ذلك للجهاز تشغيل كلّ من الكاميرا الأمامية والخلفية في الوقت نفسه. بدءًا من الإصدار 11 من نظام التشغيل Android، تتضمّن Camera2 API methods التالية التي يمكن للتطبيقات الاتصال بها لتحديد ما إذا كانت الكاميرات تتيح البث المتزامن ومعرفة إعدادات البث المتوافقة.

  • getConcurrentCameraIds: يحصل على مجموعة من مجموعات معرّفات أجهزة الكاميرا المتصلة حاليًا التي تتيح ضبط جلسات أجهزة الكاميرا بشكل متزامن.
  • isConcurrentSessionConfigurationSupported: تحقّق من إمكانية ضبط الإعدادات المتزامنة لمجموعة أجهزة الكاميرا المُقدَّمة وإعدادات جلساتها المقابلة.

يتم تضمين مجموعة من مجموعات البث الإلزامية التي يجب أن تكون متوافقة أثناء البث المتزامن من خلال خصائص كاميرا جهاز الكاميرا في سمة SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.

يجب أن يتوافق كل جهاز كاميرا يتم الإعلان عنه من خلال getConcurrentStreamingCameraIds() مع الإعدادات المضمونة التالية لعمليات البث المتزامنة.

الهدف 1 الهدف 2
النوع الحد الأقصى للحجم النوع الحد الأقصى للحجم أمثلة على حالات الاستخدام
YUV ‫s1440p معالجة الفيديو أو الصور داخل التطبيق
PRIV s1440p تحليل عدسة الكاميرا داخل التطبيق
JPEG ‫s1440p لا يمكن التقاط صور ثابتة من خلال عدسة الكاميرا
YUV / PRIV ‫s720p JPEG ‫s1440p التصوير العادي للصور الثابتة
YUV / PRIV ‫s720p YUV / PRIV ‫s1440p فيديو داخل التطبيق أو معالجة مع معاينة

يجب أن تتيح الأجهزة التي تتضمّن ميزة MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES تشمل CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) التي تتيح استخدام Y8 استبدال أحداث البث بتنسيق YUV بأحداث البث بتنسيق Y8 في جميع مجموعات أحداث البث المضمونة.

يشير الرمز s720p إلى دقة 720p (1280 × 720) أو الحد الأقصى للدقة المتوافقة مع التنسيق المحدّد الذي يعرضه StreamConfigurationMap.getOutputSizes(). يشير s1440p إلى 1440p (1920 × 1440) أو الحد الأقصى للدقة المتوافقة لالتنسيق المحدّد الذي يعرضه StreamConfigurationMap.getOutputSizes(). بالنسبة إلى الأجهزة التي لا تتضمّن إمكانات ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE ، يجب أن تكون متوافقة مع بث واحد على الأقل من Y16، Dataspace::DEPTH بدرجة دقة sVGA ، أثناء التشغيل المتزامن، حيث تكون sVGA هي درجة الدقة الأصغر من الدرجتين التاليتين:

  • الحد الأقصى لدقة الإخراج للتنسيق المحدّد
  • ‫640 x 480

التنفيذ

للسماح للتطبيقات باستعلام جهاز لمعرفة ما إذا كانت كاميراته تتيح البث المتزامن، يجب تنفيذ واجهة ICameraProvider@2.6 HAL التي تتضمّن الطرق التالية:

للحصول على مرجع لتنفيذ واجهة ICameraProvider@2.6HAL، يُرجى الاطّلاع على مكتبة HAL للكاميرا المحاكية على الرابط EmulatedCameraProviderHWLImpl.cpp.

التحقُّق

لاختبار عمل هذه الميزة على النحو المطلوب، استخدِم اختبار ConcurrentCameraTest.java CTS. يمكنك أيضًا إجراء الاختبار باستخدام تطبيق يفتح كاميرات متعددة ويشغّلها بالتزامن.

مشاكل تخصيص الموارد

إذا كانت واجهات HAL للكاميرا تعلن عن توفّر إمكانية التشغيل المتزامن لأجهزة الكاميرا، قد تواجه مشاكل في تخصيص الموارد، خاصةً في الحالات التي تتوفّر فيها موارد كافية لمعالج إشارة الصورة (ISP) على هاتف لبث الكاميرات الأمامية والخلفية (أو غيرها) بشكل متزامن، ولكن ليس بطاقتها الكاملة. في هذه الحالة، يجب أن تخصص واجهة HAL للكاميرا موارد أجهزة محدودة لكل جهاز كاميرا.

مثال على السيناريو

يوضّح السيناريو التالي هذه المشكلة.

المشكلة

يحتوي الجهاز على الإعدادات التالية:

  • رقم تعريف الكاميرا 0 هو كاميرا منطقية مدعومة بكاميرا عريضة فائقة العرض، وتستخدِم كلّ منهما موردًا واحدًا لخدمة الإنترنت.
  • معرّف الكاميرا 1 هو كاميرا تستخدِم موردًا واحدًا لموفّر خدمة الإنترنت.

يتضمّن الجهاز (الهاتف) مزوّدي خدمة إنترنت اثنين. في حال فتح معرّف الكاميرا 0 وتمت ضبط جلسة، من المحتمل أن تحجز واجهة HAL للكاميرا مزوّدَي خدمة إنترنت اثنين antisipasing استخدام كل من الكاميرا ذات العرض الفائق والكاميرا ذات العرض العادي.

في هذه الحالة، لا يمكن للكاميرا الأمامية (رقم التعريف 1) ضبط أي عمليات بث لأنّ مزوّدي خدمة الإنترنت قيد الاستخدام.

الحل

لحلّ هذه المشكلة، يمكن للإطار العمل فتح معرّفَي الكاميرا 0 و1 قبل ضبط الجلسات لتقديم تلميح إلى HAL للكاميرا حول كيفية تخصيص الموارد (لأنّه يتوقّع الآن التشغيل المتزامن للكاميرات). ومع ذلك، قد يؤدي ذلك إلى إمكانات محدودة، على سبيل المثال، قد لا يكون التكبير/التصغير قادرًا على التعامل مع نسبة نطاق التكبير/التصغير الكامل (لأنّ تبديل أرقام تعريف الكاميرات المادّية قد يتسبب في حدوث مشاكل).

لتنفيذ هذا الحلّ، عليك إجراء التعديلات التالية على provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • يجب أن يفرض إطار عمل الكاميرا فتح أجهزة الكاميرا (@3.2::ICameraDevice::open) قبل ضبط أي جلسات على أجهزة الكاميرا لكي تعمل الكاميرات بشكل متزامن. يتيح ذلك لموفّري الكاميرات تخصيص الموارد وفقًا لذلك.

  • لحلّ مشكلة عدم التمكّن من التعامل مع نسبة نطاق التكبير/التصغير بالكامل، تأكَّد من أنّ تطبيقات الكاميرا، عند استخدام الكاميرات في الوقت نفسه، تستخدم إعداد التحكّم في ZOOM_RATIO بين 1x و 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 للكاميرا لن تعرف المجموعة الكاملة من أرقام تعريف الكاميرات التي يتم فتحها للعمل المتزامن قبل ضبط الجلسات، قد يكون من الصعب عليها تحديد موارد الأجهزة (على افتراض أنّ هناك بعض المنافسة عليها).

لحلّ هذه المشكلة، يجب أن ترفض طبقات HAL للكاميرا طلبات openCamera التي تستخدم ERROR_MAX_CAMERAS_IN_USE إذا لم تكن متوافقة مع الإصدارات القديمة ولم تكن تتيح ضبط البث الكامل لجميع الكاميرات التي تعمل بشكل متزامن، وذلك بالإضافة إلى إتاحة البث المتزامن.