يسمح نظام التشغيل 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.6HAL، راجِع مكتبة HAL الخاصة بالكاميرا المحاكية على EmulatedCameraProviderHWLImpl.cpp.
التحقق من صحة البيانات
لاختبار أنّ عملية تنفيذ هذه الميزة تعمل على النحو المنشود، استخدِم اختبار
ConcurrentCameraTest.java
في مجموعة أدوات اختبار التوافق (CTS). اختبِر أيضًا استخدام تطبيق يفتح كاميرات متعددة ويشغّلها في الوقت نفسه.
مشاكل تخصيص الموارد
إذا كانت طبقات تجريد أجهزة الكاميرا (HAL) تعلن عن إمكانية التشغيل المتزامن لأجهزة الكاميرا، قد تواجه مشاكل في تخصيص الموارد، خاصةً في حال توفّر موارد كافية لمعالج إشارات الصور (ISP) على الهاتف لبث كل من الكاميرا الأمامية والخلفية (أو غيرهما) بشكل متزامن، ولكن ليس بكامل طاقتها. في هذه الحالة، يجب أن تخصّص طبقة HAL للكاميرا موارد أجهزة محدودة لكل جهاز كاميرا.
مثال على السيناريو
يوضّح السيناريو التالي هذه المشكلة.
المشكلة
يتضمّن الجهاز الإعدادات التالية:
- معرّف الكاميرا
0هو كاميرا منطقية تستند إلى كاميرا عادية وكاميرا فائقة العرض، وتستخدم كل منهما أحد موارد معالج إشارات الصور. - معرّف الكاميرا
1هو كاميرا تستخدم موردًا واحدًا من موفّر خدمة الإنترنت.
يحتوي الجهاز (الهاتف) على مزودَي خدمة إنترنت. في حال فتح معرّف الكاميرا 0 وتم إعداد جلسة، من المحتمل أن يحجز HAL للكاميرا معالجتَي صور (ISP) تحسّبًا لاستخدام الكاميرا ذات الزاوية الواسعة جدًا والكاميرا ذات الزاوية الواسعة.
في هذه الحالة، لا يمكن للكاميرا الأمامية (المعرّف 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) الخاصة بالكاميرا لن تعرف المجموعة الكاملة لمعرّفات الكاميرات التي يتم فتحها للتشغيل المتزامن قبل ضبط الجلسات، قد يكون من الصعب عليها تخصيص موارد الأجهزة (بافتراض وجود بعض المنافسة عليها).
لحلّ هذه المشكلة، يجب الحفاظ على التوافق مع الإصدارات القديمة بالإضافة إلى إتاحة البث المتزامن، ويجب أن يتعذّر تنفيذ طلبات openCamera في طبقات تجريد الأجهزة (HAL) للكاميرا مع عرض ERROR_MAX_CAMERAS_IN_USE إذا لم يكن بإمكانها توفير إعدادات البث الكاملة لجميع الكاميرات التي تعمل بشكل متزامن.