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

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