يسمح 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
إذا لم تتمكن من دعم تكوين الدفق الكامل لجميع الكاميرات التي تعمل بشكل متزامن.