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

يتيح نظام 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 دقة 720p 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

التنفيذ

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

للحصول على مرجع لتنفيذ واجهة 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 إذا لم تتمكن من ضبط إعدادات البث الكامل لجميع الكاميرات التي تعمل بشكل متزامن، وذلك للحفاظ على التوافق مع الإصدارات القديمة بالإضافة إلى إتاحة البث المتزامن.