يسمح نظام Android للأجهزة ببث محتوى أجهزة الكاميرا بشكل متزامن. على سبيل المثال، يتيح ذلك للجهاز تشغيل كلّ من الكاميرا الأمامية والخلفية في الوقت نفسه. بدءًا من الإصدار 11 من نظام التشغيل Android، تتضمّن Camera2 API methods التالية التي يمكن للتطبيقات الاتصال بها لتحديد ما إذا كانت الكاميرات تتيح البث المتزامن ومعرفة إعدادات البث المتوافقة.
-
getConcurrentCameraIds
: يحصل على مجموعة من مجموعات معرّفات أجهزة الكاميرا المتصلة حاليًا التي تتيح ضبط جلسات أجهزة الكاميرا بشكل متزامن. isConcurrentSessionConfigurationSupported
: تتحقّق مما إذا كانت مجموعة أجهزة الكاميرا المقدّمة ونظيرتها يمكن تهيئة عمليات تهيئة الجلسات بالتزامن.
يشير هذا المصطلح إلى مجموعة من مجموعات البث الإلزامية التي يجب استخدامها أثناء البث المباشر.
التي يتم بثها من خلال خصائص كاميرا جهاز الكاميرا في
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
الموقع.
يجب أن يكون كل جهاز كاميرا يتم الإعلان عنه من خلال getConcurrentStreamingCameraIds()
تتيح لك الإعدادات المضمونة التالية لأحداث البث المتزامنة.
الهدف 1 | الهدف 2 | |||
---|---|---|---|---|
النوع | أقصى حجم | النوع | الحد الأقصى للحجم | أمثلة على حالات الاستخدام |
YUV | s1440p | معالجة الفيديوهات أو الصور داخل التطبيق | ||
PRIV | s1440p | تحليل عدسة الكاميرا داخل التطبيق | ||
JPEG | s1440p | لا يمكن التقاط صور ثابتة من خلال عدسة الكاميرا | ||
ترخيص YUV / PRIV | دقة 720p | JPEG | دقة 1440p | التصوير العادي للصور الثابتة |
ترخيص YUV / PRIV | دقة 720p | 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 x 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. يمكنك أيضًا إجراء الاختبار باستخدام تطبيق يفتح كاميرات متعددة ويشغّلها
بالتزامن.
مشاكل تخصيص الموارد
إذا كانت واجهات HAL للكاميرا تعلن عن توفّر إمكانية التشغيل المتزامن لأجهزة الكاميرا، قد تواجه مشاكل في تخصيص الموارد، خاصةً في الحالات التي تتوفّر فيها موارد كافية لمعالج إشارة الصورة (ISP) على هاتف لبث كل من الكاميرا الأمامية والخلفية (أو غيرها) بشكل متزامن، ولكن ليس بطاقتها الكاملة. في هذه الحالة، يجب أن تخصّص طبقة تجريد الأجهزة (HAL) للكاميرا بشكل محدود الموارد المادية لكل جهاز كاميرا.
مثال على السيناريو
يوضح السيناريو التالي هذه المشكلة.
المشكلة
يحتوي الجهاز على الإعدادات التالية:
- معرّف الكاميرا
0
هو كاميرا منطقية تستند إليها كاميرا لالتقاط صور موسّعة وفائقة الاتساع الكاميرا، ويحصل كل منها على مورد واحد لمزود خدمة الإنترنت. - رقم تعريف الكاميرا
1
هو كاميرا تستخدِم موردًا واحدًا لمزوّد خدمة الإنترنت.
يتضمّن الجهاز (الهاتف) مزوّدي خدمة إنترنت اثنين. في حال فتح معرّف الكاميرا 0
وضبط جلسة، من المحتمل أن تحجز واجهة HAL للكاميرا مزوّدَي خدمة إنترنت اثنين antisipasing
استخدام كل من الكاميرا ذات العرض الفائق والكاميرا ذات العرض الواسع.
في هذه الحالة، لا يمكن للكاميرا الأمامية (رقم التعريف 1
) ضبط أي
عمليات بث لأنّ مزوّدي خدمة الإنترنت قيد الاستخدام.
الحل
لحلّ هذه المشكلة، يمكن للإطار العمل فتح معرّفَي الكاميرا 0
و1
قبل ضبط الجلسات لتقديم تلميح إلى HAL للكاميرا حول كيفية
تخصيص الموارد (لأنّه يتوقّع الآن التشغيل المتزامن للكاميرات).
ومع ذلك، قد يؤدي ذلك إلى إمكانات محدودة، على سبيل المثال، قد لا يكون التكبير/التصغير قادرًا على التعامل مع نسبة نطاق التكبير/التصغير الكامل (لأنّ تبديل أرقام تعريف الكاميرات المادّية قد يتسبب في حدوث مشاكل).
لتنفيذ هذا الحل، يمكنك إجراء التحديثات التالية على
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
يجب أن يفرض إطار عمل الكاميرا فتح أجهزة الكاميرا (
@3.2::ICameraDevice::open
) قبل ضبط أي جلسات على أجهزة الكاميرا، وذلك لكي تعمل الكاميرات بشكل متزامن. يسمح هذا الإجراء باستخدام الكاميرا. ومزودي الخدمة بتخصيص الموارد وفقًا لذلك.لمعالجة مشكلة عدم القدرة على معالجة جميع بالنسبة إلى نطاق التكبير أو التصغير، فتأكد من أن تطبيقات الكاميرا، عند استخدام الكاميرات بشكل متزامن، نضمن لك استخدام إعداد التحكّم في
ZOOM_RATIO
بين 1x و1 فقط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
إذا لم تكن متوافقة مع الإصدارات القديمة ولم تكن تتيح ضبط البث الكامل
لجميع الكاميرات التي تعمل بشكل متزامن، وذلك بالإضافة إلى إتاحة البث المتزامن.