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

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

  • 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.6 لواجهة HAL، راجِع مكتبة HAL للكاميرا المحاكية على EmulatedCameraProviderHWLImpl.cpp.

التحقُّق

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

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

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

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

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

المشكلة

يتضمّن الجهاز الإعدادات التالية:

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

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

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

الحل

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

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

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

  • لحلّ مشكلة عدم إمكانية التعامل مع نسبة نطاق التكبير/التصغير الكاملة، تأكَّد من أنّ تطبيقات الكاميرا، عند استخدام الكاميرات في الوقت نفسه، تضمن استخدام إعداد التحكّم ZOOM_RATIO بين 1x وMAX_DIGITAL_ZOOM فقط بدلاً من ZOOM_RATIO_RANGE الكامل (يمنع ذلك التبديل بين الكاميرات المادية داخليًا، ما قد يتطلّب المزيد من معالجات إشارات الصور).

Problem with testDualCameraPreview

عند إجراء التعديلات المذكورة أعلاه، قد يؤدي ذلك إلى حدوث مشكلة في سلوك مسموح به بموجب اختبار MultiViewTest.java#testDualCameraPreview.

لا يضبط الاختبار testDualCameraPreview الجلسات إلا بعد فتح جميع الكاميرات. ويتم ذلك بالتسلسل التالي:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

ومع ذلك، يمكنه التعامل مع حالات تعذُّر فتح الكاميرا باستخدام ERROR_MAX_CAMERAS_IN_USE [1]. قد تعتمد تطبيقات الجهات الخارجية على هذا السلوك.

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

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