دفق الكاميرا المتزامن

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

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

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

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

الهدف 1 الهدف 2
يكتب اقصى حجم يكتب اقصى حجم حالات الاستخدام العينة
يو في s1440p معالجة الفيديو أو الصور داخل التطبيق
خاص s1440p تحليل عدسة الكاميرا داخل التطبيق
جبيغ s1440p لا يوجد عدسة الكاميرا لالتقاط الصور الثابتة
يو في / بريف s720p جبيغ s1440p التصوير الثابت القياسي
يو في / بريف s720p يو في / بريف 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 × 480

تطبيق

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

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