يتيح نظام 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 | دقة 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 × 1440) أو الحد الأقصى للدقة المتوافقة
لالتنسيق المحدّد الذي يعرضه
StreamConfigurationMap.getOutputSizes()
.
يجب أن تتيح الأجهزة التي لا تتضمّن ميزات
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
بث محتوى من النوع Y16 على الأقل، Dataspace::DEPTH
بدرجة دقة sVGA، أثناء التشغيل المتزامن، على أن تكون قيمة sVGA أصغر من درجة الدقة التالية:
- الحد الأقصى لدقة الإخراج للتنسيق المحدد
- 640 x 480
التنفيذ
للسماح للتطبيقات بالاستعلام عن جهاز لتحديد ما إذا كانت الكاميرات متوافقة مع البث المتزامن، يمكنك تنفيذ واجهة HAL ICameraProvider@2.6
التي تتضمن الطرق التالية:
للحصول على مرجع لتنفيذ واجهة 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
إذا لم تتمكن من ضبط إعدادات البث الكامل
لجميع الكاميرات التي تعمل بشكل متزامن، وذلك للحفاظ على التوافق مع الإصدارات القديمة بالإضافة إلى
إتاحة البث المتزامن.