في Android 9، تم تقديم دعم واجهة برمجة التطبيقات للأجهزة المتعدّدة الكاميرات من خلال جهاز كاميرا منطقي جديد يتألف من جهازَي كاميرا فعلية أو أكثر تشير إلى الاتجاه نفسه. يظهر جهاز الكاميرا المنطقي كتطبيق CameraDevice/CaptureSession واحد، ما يسمح بالتفاعل مع ميزات الكاميرات المتعدّدة المدمَجة في طبقة HAL. يمكن للتطبيقات اختياريًا الوصول إلى تدفقات الكاميرا الفعلية الأساسية والبيانات الوصفية وعناصر التحكّم والتحكّم فيها.
الشكل 1 دعم الكاميرات المتعدّدة
في هذا الرسم البياني، تم ترميز معرّفات الكاميرات المختلفة بالألوان. يمكن للتطبيق بث المخازن المؤقتة الأولية من كل كاميرا فعلية في الوقت نفسه. من الممكن أيضًا ضبط عناصر تحكّم منفصلة وتلقّي بيانات وصفية منفصلة من كاميرات فعلية مختلفة.
الأمثلة والمصادر
يجب الإعلان عن الأجهزة المتعدّدة الكاميرات باستخدام الـ إمكانية الكاميرات المتعدّدة المنطقية.
يمكن لعملاء الكاميرا طلب معرّف الكاميرا للأجهزة الفعلية التي تتألف منها كاميرا منطقية معيّنة من خلال استدعاء
getPhysicalCameraIds().
بعد ذلك، يتم استخدام المعرّفات التي يتم عرضها كجزء من النتيجة للتحكّم في الأجهزة الفعلية بشكل فردي من خلال
setPhysicalCameraId().
يمكن طلب النتائج من هذه الطلبات الفردية من النتيجة الكاملة
من خلال استدعاء
getPhysicalCameraResults().
قد لا تتيح طلبات الكاميرا الفعلية الفردية سوى مجموعة فرعية محدودة من المَعلمات. لتلقّي قائمة بالمَعلمات المتوافقة، يمكن للمطوّرين استدعاء
getAvailablePhysicalCameraRequestKeys().
لا تتيح تدفقات الكاميرا الفعلية سوى الطلبات غير الخاصة بإعادة المعالجة، ولا تتيح سوى أجهزة الاستشعار أحادية اللون وBayer.
التنفيذ
قائمة التحقّق من الدعم
لإضافة أجهزة الكاميرات المتعدّدة المنطقية على جانب طبقة HAL:
- أضِف إمكانية
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAلأي جهاز كاميرا منطقي يستند إلى جهازَي كاميرا فعلية أو أكثر يتم عرضهما أيضًا لتطبيق. - املأ حقل البيانات الوصفية الثابت
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSبقائمة من معرّفات الكاميرات الفعلية. - املأ البيانات الوصفية الثابتة ذات الصلة بالعمق المطلوبة للربط بين
وحدات البكسل في تدفقات الكاميرا الفعلية:
ANDROID_LENS_POSE_ROTATION،ANDROID_LENS_POSE_TRANSLATION،ANDROID_LENS_INTRINSIC_CALIBRATION،ANDROID_LENS_DISTORTION،ANDROID_LENS_POSE_REFERENCE. اضبط حقل البيانات الوصفية الثابت
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEعلى:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: لأجهزة الاستشعار في وضع "رئيسي-رئيسي"، لا تتم مزامنة غالق/تعرّض الأجهزة.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: لأجهزة الاستشعار في وضع "رئيسي-ثانوي"، تتم مزامنة غالق/تعرّض الأجهزة.
املأ
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSبقائمة من المَعلمات المتوافقة مع الكاميرات الفعلية الفردية. يمكن أن تكون القائمة فارغة إذا كان الجهاز المنطقي لا يتيح الطلبات الفردية.إذا كانت الطلبات الفردية متاحة، عالِج وطبِّق الفردية
physicalCameraSettingsالتي يمكن أن تصل كجزء من طلبات الالتقاط وألحِق الفرديةphysicalCameraMetadataوفقًا لذلك.بالنسبة إلى إصدارات جهاز Camera HAL 3.5 (التي تم تقديمها في Android 10) أو الإصدارات الأحدث، املأ
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_IDمفتاح النتيجة باستخدام معرّف الكاميرا الفعلية النشطة الحالية التي تستند إليها الكاميرا المنطقية.
بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 9، يجب أن تتيح أجهزة الكاميرا استبدال تدفق YUV أو RAW منطقي واحد بتدفقات فعلية بنفس الحجم (لا ينطبق ذلك على تدفقات RAW) والتنسيق نفسه من كاميرتَين فعليتَين. لا ينطبق ذلك على الأجهزة التي تعمل بنظام التشغيل Android 10.
بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 10 والتي يكون فيها إصدار جهاز Camera HAL
3.5
أو إصدار أحدث، يجب أن يتيح جهاز الكاميرا
isStreamCombinationSupported
لكي تتمكّن التطبيقات من الاستعلام عما إذا كانت مجموعة تدفقات معيّنة تحتوي على
تدفقات فعلية متوافقة.
خريطة إعدادات التدفق
بالنسبة إلى الكاميرا المنطقية، تكون مجموعات التدفقات الإلزامية لجهاز الكاميرا بمستوى جهاز معيّن هي نفسها المطلوبة في
CameraDevice.createCaptureSession.
يجب أن تكون جميع التدفقات في خريطة إعدادات التدفق تدفقات منطقية.
بالنسبة إلى جهاز الكاميرا المنطقي الذي يتيح إمكانية RAW مع كاميرات فرعية فعلية بأحجام مختلفة، إذا ضبط أحد التطبيقات تدفق RAW منطقيًا، يجب ألا ينتقل جهاز الكاميرا المنطقي إلى كاميرات فرعية فعلية بأحجام مختلفة لأجهزة الاستشعار. يضمن ذلك عدم تعطُّل تطبيقات التقاط RAW الحالية.
للاستفادة من ميزة التكبير/التصغير البصري التي تم تنفيذها في طبقة HAL من خلال التبديل بين الكاميرات الفرعية الفعلية أثناء التقاط RAW، يجب أن تضبط التطبيقات تدفقات الكاميرات الفرعية الفعلية بدلاً من تدفق RAW منطقي.
مجموعة التدفقات المضمونة
يجب أن تضمن كل من الكاميرا المنطقية والكاميرات الفعلية الأساسية مجموعات التدفقات الإلزامية المطلوبة لمستويات أجهزتها.
يجب أن يعمل جهاز الكاميرا المنطقي بالطريقة نفسها التي يعمل بها جهاز الكاميرا الفعلي استنادًا إلى مستوى الجهاز وإمكاناته. يُنصح بأن تكون مجموعة الميزات الخاصة به مجموعة فرعية من مجموعة الميزات الخاصة بالكاميرات الفعلية الفردية.
بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 9، يجب أن تتيح الكاميرا المنطقية ما يلي لكل مجموعة تدفقات مضمونة:
استبدال تدفق YUV_420_888 أو تدفق RAW منطقي واحد بتدفقَين فعليَين بنفس الحجم والتنسيق، كل منهما من كاميرا فعلية منفصلة، بشرط أن تكون الكاميرات الفعلية تتيح الحجم والتنسيق.
إضافة تدفقَين RAW، أحدهما من كل كاميرا فعلية، إذا كانت الكاميرا المنطقية لا تعلن عن إمكانية RAW، ولكن الكاميرات الفعلية الأساسية تفعل ذلك. يحدث ذلك عادةً عندما تكون الكاميرات الفعلية بأحجام مختلفة لأجهزة الاستشعار.
استخدام تدفقات فعلية بدلاً من تدفق منطقي بنفس الحجم والتنسيق. يجب ألا يؤدي ذلك إلى إبطاء عدد اللقطات في الثانية لعملية الالتقاط عندما تكون المدة الدنيا للقطة في التدفقات الفعلية والمنطقية هي نفسها.
اعتبارات الأداء والطاقة
الأداء:
- قد يؤدي ضبط التدفقات الفعلية وبثها إلى إبطاء عدد اللقطات في الثانية للكاميرا المنطقية بسبب قيود الموارد.
- قد يؤدي تطبيق إعدادات الكاميرا الفعلية إلى إبطاء عدد اللقطات في الثانية إذا تم ضبط الكاميرات الأساسية على أعداد مختلفة من اللقطات في الثانية.
الطاقة:
- تستمر ميزة تحسين الطاقة في طبقة HAL في العمل في الحالة التلقائية.
- قد يؤدي ضبط التدفقات الفعلية أو طلبها إلى إلغاء ميزة تحسين الطاقة الداخلية في طبقة HAL واستخدام المزيد من الطاقة.
التخصيص
يمكنك تخصيص عملية تنفيذ جهازك بالطرق التالية.
- يعتمد الناتج المدمج لجهاز الكاميرا المنطقي بالكامل على عملية تنفيذ طبقة HAL. يكون قرار كيفية استخلاص التدفقات المنطقية المدمجة من الكاميرات الفعلية شفافًا للتطبيق وإطار عمل كاميرا Android.
- يمكن اختياريًا إتاحة الطلبات والنتائج الفعلية الفردية. تعتمد مجموعة المَعلمات المتاحة في هذه الطلبات أيضًا بالكامل على عملية تنفيذ طبقة HAL المحدّدة.
- اعتبارًا من Android 10، يمكن لطبقة HAL تقليل عدد الـ
كاميرات التي يمكن أن يفتحها التطبيق مباشرةً من خلال اختيار عدم الـ
إعلان عن بعض أو كل PHYSICAL_IDs في الـ
getCameraIdList. يجب أن يعرض استدعاءgetPhysicalCameraCharacteristicsبعد ذلك خصائص الكاميرا الفعلية.
التحقق من صحة البيانات
يجب أن تجتاز أجهزة الكاميرات المتعدّدة المنطقية اختبارات توافق الكاميرا (CTS) مثل أي كاميرا عادية أخرى.
يمكن العثور على حالات الاختبار التي تستهدف هذا النوع من الأجهزة في الـ
LogicalCameraDeviceTest
وحدة.
تستهدف اختبارات ITS الثلاثة هذه الأنظمة المتعدّدة الكاميرات لتسهيل عملية دمج الصور بشكل سليم:
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
يتم إجراء اختبارَي المشهد 1 والمشهد 4 باستخدام جهاز اختبار
ITS-in-a-box
يؤكد اختبار test_multi_camera_match أنّ سطوع مركز الصور متطابق عندما تكون الكاميرتان مفعّلتَين. يؤكد اختبار test_multi_camera_alignment أنّه يتم تحميل مسافات الكاميرا واتجاهاتها ومَعلمات التشوه بشكل سليم. إذا كان نظام الكاميرات المتعدّدة يتضمّن كاميرا ذات مجال رؤية واسع (>90 درجة)، يكون إصدار rev2 من صندوق ITS مطلوبًا.
Sensor_fusion هو جهاز اختبار ثانٍ يتيح حركة الهاتف المتكرّرة والمحدّدة ويؤكد أنّ الطوابع الزمنية لجهاز الجيروسكوب ووحدة استشعار الصور متطابقة وأنّ لقطات الكاميرات المتعدّدة متزامنة.
تتوفّر جميع الصناديق من خلال AcuSpec, Inc. (www.acuspecinc.com و fred@acuspecinc.com) وMYWAY Manufacturing (www.myway.tw وsales@myway.tw). بالإضافة إلى ذلك، يمكن شراء صندوق ITS rev1 من خلال West-Mark (www.west-mark.com و dgoodman@west-mark.com).
أفضل الممارسات
للاستفادة بشكل كامل من الميزات التي تتيحها الكاميرات المتعدّدة مع الحفاظ على توافق التطبيق، اتّبِع أفضل الممارسات التالية عند تنفيذ جهاز كاميرا منطقي متعدّد الكاميرات:
- (Android 10 أو إصدار أحدث) أخفِ الكاميرات الفرعية الفعلية من
getCameraIdList. يقلّل ذلك من عدد الكاميرات التي يمكن أن تفتحها التطبيقات مباشرةً، ما يزيل حاجة التطبيقات إلى منطق معقّد لاختيار الكاميرا. - (Android 11 أو إصدار أحدث) بالنسبة إلى جهاز الكاميرا المنطقي المتعدّد الكاميرات الذي يتيح التكبير/التصغير البصري، نفِّذ واجهة برمجة التطبيقات
ANDROID_CONTROL_ZOOM_RATIO، واستخدِمANDROID_SCALER_CROP_REGIONلقص نسبة العرض إلى الارتفاع فقط.ANDROID_CONTROL_ZOOM_RATIOتتيح واجهة برمجة التطبيقات للجهاز التصغير والحفاظ على دقة أفضل. في هذه الحالة، يجب أن تضبط طبقة HAL نظام الإحداثيات لكل منANDROID_SCALER_CROP_REGION،ANDROID_CONTROL_AE_REGIONS،ANDROID_CONTROL_AWB_REGIONS،ANDROID_CONTROL_AF_REGIONS،ANDROID_STATISTICS_FACE_RECTANGLES، وANDROID_STATISTICS_FACE_LANDMARKSللتعامل مع مجال الرؤية بعد التكبير/التصغير كصفيف نشط لجهاز الاستشعار. لمزيد من المعلومات حول كيفية عملANDROID_SCALER_CROP_REGIONمعANDROID_CONTROL_ZOOM_RATIO، اطّلِع علىcamera3_crop_reprocess#cropping. - بالنسبة إلى الأجهزة المتعدّدة الكاميرات التي تتضمّن كاميرات فعلية بإمكانات مختلفة، تأكَّد من أنّ الجهاز يعلن عن إتاحة قيمة أو نطاق معيّن لعنصر تحكّم معيّن فقط إذا كان نطاق التكبير/التصغير بالكامل يتيح القيمة أو النطاق. على سبيل المثال، إذا كانت الكاميرا المنطقية تتألف من كاميرا ذات مجال رؤية واسع جدًا وكاميرا ذات مجال رؤية واسع وكاميرا مقرّبة، اتّبِع الخطوات التالية:
- إذا كانت أحجام الصفيف النشط للكاميرات الفعلية مختلفة، يجب أن تنفّذ طبقة Camera HAL عملية الربط من الصفائف النشطة للكاميرات الفعلية إلى الصفيف النشط للكاميرا المنطقية لكل من
ANDROID_SCALER_CROP_REGIONوANDROID_CONTROL_AE_REGIONSوANDROID_CONTROL_AWB_REGIONSوANDROID_CONTROL_AF_REGIONSوANDROID_STATISTICS_FACE_RECTANGLESوANDROID_STATISTICS_FACE_LANDMARKSبحيث يكون نظام الإحداثيات من منظور التطبيق هو حجم الصفيف النشط للكاميرا المنطقية. - إذا كانت الكاميرتان ذات المجال الرؤية الواسع والمقرّبة تتيحان ميزة "التركيز التلقائي"، ولكن الكاميرا ذات المجال الرؤية الواسع جدًا تتيح التركيز الثابت، تأكَّد من أنّ الكاميرا المنطقية تعلن عن إتاحة ميزة "التركيز التلقائي". يجب أن تحاكي طبقة HAL آلة حالة "التركيز التلقائي" للكاميرا ذات الصورة الموسّعة بحيث عندما يختار التطبيق التصغير إلى عدسة لالتقاط صور موسّعة، يكون التركيز الثابت للكاميرا الفعلية الأساسية شفافًا للتطبيق، وتعمل آلات حالة "التركيز التلقائي" للأوضاع المتوافقة مع "التركيز التلقائي" على النحو المتوقّع.
- إذا كانت الكاميرتان ذات المجال الرؤية الواسع والمقرّبة تتيحان دقة 4K بمعدّل 60 لقطة في الثانية، وكانت الكاميرا ذات المجال الرؤية الواسع جدًا لا تتيح سوى دقة 4K بمعدّل 30 لقطة في الثانية أو دقة 1080p بمعدّل 60 لقطة في الثانية، ولكن ليس دقة 4K بمعدّل 60 لقطة في الثانية، تأكَّد من أنّ الكاميرا المنطقية لا تعلن عن دقة 4k بمعدّل 60 لقطة في الثانية في إعدادات التدفق المتوافقة. يضمن ذلك سلامة إمكانات الكاميرا المنطقية، ما يضمن عدم مواجهة التطبيق مشكلة عدم تحقيق دقة 4k بمعدّل 60 لقطة في الثانية بقيمة أقل من 1.
ANDROID_CONTROL_ZOOM_RATIO
- إذا كانت أحجام الصفيف النشط للكاميرات الفعلية مختلفة، يجب أن تنفّذ طبقة Camera HAL عملية الربط من الصفائف النشطة للكاميرات الفعلية إلى الصفيف النشط للكاميرا المنطقية لكل من
- في Android 10 والإصدارات الأحدث، ليس مطلوبًا أن تتيح الكاميرا المنطقية المتعدّدة الكاميرات مجموعات التدفقات التي تتضمّن تدفقات فعلية.
إذا كانت طبقة HAL تتيح مجموعة تتضمّن تدفقات فعلية:
- (Android 11 أو إصدار أحدث) لتحسين التعامل مع حالات الاستخدام، مثل العمق من الصور المجسّمة وتتبُّع الحركة، اجعل مجال رؤية نواتج التدفق الفعلي كبيرًا قدر الإمكان باستخدام الأجهزة. ومع ذلك، إذا كان التدفق الفعلي والتدفق المنطقي ينشآن من الكاميرا الفعلية نفسها، قد تفرض قيود الأجهزة أن يكون مجال رؤية التدفق الفعلي هو نفسه مجال رؤية التدفق المنطقي.
- لمعالجة ضغط الذاكرة الناتج عن تدفقات فعلية متعدّدة،
تأكَّد من أنّ التطبيقات تستخدم
discardFreeBuffersلإلغاء تخصيص المخازن المؤقتة المجانية (المخازن المؤقتة التي يحرّرها المستهلك، ولكن لم يضعها المنتِج في قائمة الانتظار بعد) إذا كان من المتوقّع أن يكون التدفق الفعلي غير نشط لفترة من الوقت. - إذا لم تكن التدفقات الفعلية من كاميرات فعلية مختلفة مرفقة عادةً
بالطلب نفسه، تأكَّد من أنّ التطبيقات تستخدم
surface groupبحيث يتم استخدام قائمة انتظار واحدة للمخزن المؤقت لدعم سطحَين يواجهان التطبيق، ما يقلّل من استهلاك الذاكرة.