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