قدم Android 9 دعم واجهة برمجة التطبيقات للأجهزة متعددة الكاميرات من خلال جهاز كاميرا منطقي جديد يتكون من جهازين أو أكثر من أجهزة الكاميرا الفعلية التي تشير في نفس الاتجاه. يتم عرض جهاز الكاميرا المنطقي كجهاز CameraDevice / CaptureSession واحد لتطبيق يسمح بالتفاعل مع ميزات HAL المتكاملة للكاميرات المتعددة. يمكن للتطبيقات الوصول اختياريًا والتحكم في تدفقات الكاميرا المادية الأساسية والبيانات الوصفية وعناصر التحكم.
الشكل 1 . دعم متعدد الكاميرات
في هذا الرسم التخطيطي ، يتم ترميز معرفات الكاميرا المختلفة بالألوان. يمكن للتطبيق دفق المخازن المؤقتة الأولية من كل كاميرا فعلية في نفس الوقت. من الممكن أيضًا تعيين عناصر تحكم منفصلة وتلقي بيانات وصفية منفصلة من كاميرات مادية مختلفة.
أمثلة ومصادر
يجب الإعلان عن الأجهزة متعددة الكاميرات مع إمكانية تعدد الكاميرات المنطقية .
يمكن لعملاء الكاميرا الاستعلام عن معرف الكاميرا للأجهزة المادية التي تتكون منها كاميرا منطقية معينة عن طريق استدعاء getPhysicalCameraIds()
. يتم بعد ذلك استخدام المعرفات التي يتم إرجاعها كجزء من النتيجة للتحكم في الأجهزة المادية بشكل فردي من خلال setPhysicalCameraId()
. يمكن الاستعلام عن نتائج مثل هذه الطلبات الفردية من النتيجة الكاملة getPhysicalCameraResults()
.
قد تدعم طلبات الكاميرا المادية الفردية مجموعة فرعية محدودة فقط من المعلمات. لتلقي قائمة بالمعلمات المدعومة ، يمكن للمطورين استدعاء getAvailablePhysicalCameraRequestKeys()
.
يتم دعم تدفقات الكاميرا المادية فقط للطلبات التي لا تتم إعادة المعالجة ولأجهزة الاستشعار أحادية اللون والمستشعرات ثنائية الطبقة فقط.
تطبيق
قائمة مراجعة الدعم
لإضافة أجهزة منطقية متعددة الكاميرات على جانب 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 حيث يكون إصدار جهاز الكاميرا HAL 3.5 أو أعلى ، يجب أن يدعم جهاز الكاميرا isStreamCombinationSupported
للتطبيقات للاستعلام عما إذا كانت مجموعة دفق معينة تحتوي على تدفقات فعلية مدعومة.
خريطة تكوين الدفق
بالنسبة للكاميرا المنطقية ، فإن مجموعات البث الإلزامية لجهاز الكاميرا بمستوى معين من الأجهزة هي نفسها المطلوبة في CameraDevice.createCaptureSession
. يجب أن تكون جميع التدفقات في خريطة تكوين الدفق تدفقات منطقية.
بالنسبة لجهاز الكاميرا المنطقي الذي يدعم قدرة RAW مع الكاميرات الفرعية المادية ذات الأحجام المختلفة ، إذا قام أحد التطبيقات بتكوين دفق RAW منطقي ، يجب ألا يتحول جهاز الكاميرا المنطقي إلى الكاميرات الفرعية المادية بأحجام مستشعر مختلفة. هذا يضمن عدم كسر تطبيقات التقاط RAW الحالية.
للاستفادة من التكبير البصري الذي يتم تنفيذه باستخدام HAL عن طريق التبديل بين الكاميرات الفرعية المادية أثناء التقاط RAW ، يجب على التطبيقات تكوين تدفقات فعلية للكاميرا الفرعية بدلاً من دفق RAW المنطقي.
مزيج تيار مضمون
يجب أن تضمن كل من الكاميرا المنطقية والكاميرات المادية الأساسية مجموعات البث الإلزامية المطلوبة لمستويات أجهزتهم.
يجب أن يعمل جهاز الكاميرا المنطقي بنفس الطريقة التي يعمل بها جهاز الكاميرا الفعلي بناءً على مستوى أجهزته وقدراته. يوصى بأن تكون مجموعة الميزات الخاصة بها مجموعة شاملة من الكاميرات المادية الفردية.
على الأجهزة التي تعمل بنظام Android 9 ، لكل مجموعة بث مضمونة ، يجب أن تدعم الكاميرا المنطقية:
استبدال YUV_420_888 منطقي واحد أو دفق خام مع دفقين فعليين من نفس الحجم والشكل ، كل منهما من كاميرا مادية منفصلة ، بالنظر إلى أن الحجم والشكل تدعمهما الكاميرات المادية.
إضافة دفقين خام ، واحد من كل كاميرا فعلية ، إذا كانت الكاميرا المنطقية لا تعلن عن قدرة RAW ، لكن الكاميرات المادية الأساسية تفعل ذلك. يحدث هذا عادةً عندما يكون للكاميرات الفعلية أحجام مختلفة من المستشعرات.
استخدام التدفقات المادية بدلاً من تدفق منطقي من نفس الحجم والشكل. يجب ألا يؤدي ذلك إلى إبطاء معدل الإطارات للالتقاط عندما تكون مدة الإطار الدنيا للتدفقات المادية والمنطقية هي نفسها.
اعتبارات الأداء والقوة
أداء:
- قد يؤدي تكوين التدفقات المادية وتدفقها إلى إبطاء معدل التقاط الكاميرا المنطقية بسبب قيود الموارد.
- قد يؤدي تطبيق إعدادات الكاميرا المادية إلى إبطاء معدل الالتقاط إذا تم وضع الكاميرات الأساسية في معدلات إطارات مختلفة.
قوة:
- يستمر تحسين الطاقة في HAL في العمل في الحالة الافتراضية.
- قد يؤدي تكوين أو طلب التدفقات المادية إلى تجاوز تحسين الطاقة الداخلية لـ HAL وتكبد المزيد من استخدام الطاقة.
التخصيص
يمكنك تخصيص تنفيذ جهازك بالطرق التالية.
- يعتمد الإخراج المدمج لجهاز الكاميرا المنطقي كليًا على تنفيذ HAL. القرار بشأن كيفية اشتقاق التدفقات المنطقية المدمجة من الكاميرات المادية هو قرار شفاف للتطبيق وإطار عمل كاميرا Android.
- يمكن دعم الطلبات والنتائج المادية الفردية بشكل اختياري. تعتمد مجموعة المعلمات المتوفرة في مثل هذه الطلبات كليًا أيضًا على تنفيذ HAL المحدد.
- من Android 10 ، يمكن لـ HAL تقليل عدد الكاميرات التي يمكن فتحها مباشرة بواسطة التطبيق عن طريق اختيار عدم الإعلان عن بعض أو كل PHYSICAL_IDs في
getCameraIdList
. يجب أن يؤدي استدعاءgetPhysicalCameraCharacteristics
إلى إرجاع خصائص الكاميرا الفعلية.
تصديق
يجب أن تمرر الأجهزة المنطقية ذات الكاميرات المتعددة CTS للكاميرا مثل أي كاميرا عادية أخرى. يمكن العثور على حالات الاختبار التي تستهدف هذا النوع من الأجهزة في وحدة LogicalCameraDeviceTest
.
تستهدف اختبارات ITS الثلاثة أنظمة الكاميرات المتعددة لتسهيل الاندماج الصحيح للصور:
-
scene1/test_multi_camera_match.py
-
scene4/test_multi_camera_alignment.py
-
sensor_fusion/test_multi_camera_frame_sync.py
يتم إجراء اختبارات المشهد 1 والمشهد 4 باستخدام منصة اختبار ITS-in-a-box . يؤكد اختبار test_multi_camera_match
أن سطوع مركز الصور يتطابق عند تمكين الكاميرتين. يؤكد اختبار test_multi_camera_alignment
أنه يتم تحميل مباعدة الكاميرا والتوجيهات ومعلمات التشويه بشكل صحيح. إذا كان النظام متعدد الكاميرات يشتمل على كاميرا Wide FoV (> 90 درجة) ، فإن إصدار rev2 من صندوق ITS مطلوب.
Sensor_fusion
هو جهاز اختبار ثانٍ يتيح الحركة المتكررة والمحددة للهاتف ويؤكد أن الطوابع الزمنية للجيروسكوب ومستشعر الصورة متطابقتان وأن الإطارات متعددة الكاميرات متزامنة.
جميع الصناديق متاحة من خلال AcuSpec، Inc. ( www.acuspecinc.com ، fred@acuspecinc.com) و MYWAY Manufacturing ( www.myway.tw ، sales@myway.tw). بالإضافة إلى ذلك ، يمكن شراء صندوق rev1 ITS من خلال West-Mark ( www.west-mark.com ، dgoodman@west-mark.com).
أفضل الممارسات
للاستفادة الكاملة من الميزات التي تم تمكينها بواسطة الكاميرات المتعددة مع الحفاظ على توافق التطبيقات ، اتبع أفضل الممارسات عند تنفيذ جهاز منطقي متعدد الكاميرات:
- (Android 10 أو أعلى) إخفاء الكاميرات الفرعية المادية من
getCameraIdList
. هذا يقلل من عدد الكاميرات التي يمكن فتحها مباشرة بواسطة التطبيقات ، مما يلغي الحاجة إلى أن يكون للتطبيقات منطق اختيار معقد للكاميرا. - (Android 11 أو أحدث) بالنسبة لجهاز منطقي متعدد الكاميرات يدعم التكبير البصري ، قم بتنفيذ
ANDROID_CONTROL_ZOOM_RATIO
API واستخدمANDROID_SCALER_CROP_REGION
لاقتصاص نسبة العرض إلى الارتفاع فقط.ANDROID_CONTROL_ZOOM_RATIO
تمكن الجهاز من التصغير والحفاظ على دقة أفضل. في هذه الحالة ، يجب على HAL ضبط نظام الإحداثيات لـANDROID_SCALER_CROP_REGION
، وANDROID_CONTROL_AE_REGIONS
، وANDROID_CONTROL_AWB_REGIONS
وANDROID_STATISTICS_FACE_RECTANGLES
وANDROID_STATISTICS_FACE_LANDMARKS
حقل عرضANDROID_CONTROL_AF_REGIONS
، ومعاملة مجال التكبير / التصغير ANDROID_STATISTMARK لمزيد من المعلومات حول كيفية عملANDROID_SCALER_CROP_REGION
معANDROID_CONTROL_ZOOM_RATIO
، راجعcamera3_crop_reprocess#cropping
. - بالنسبة للأجهزة متعددة الكاميرات المزودة بكاميرات فعلية ذات إمكانيات مختلفة ، تأكد من أن الجهاز يعلن عن دعم قيمة أو نطاق معين لعنصر تحكم فقط إذا كان نطاق التكبير / التصغير بالكامل يدعم القيمة أو النطاق. على سبيل المثال ، إذا كانت الكاميرا المنطقية مكونة من كاميرا فائقة الاتساع وكاميرا عريضة وكاميرا مقربة ، فقم بما يلي:
- إذا كانت أحجام المصفوفات النشطة للكاميرات الفعلية مختلفة ، فيجب على الكاميرا HAL إجراء التعيين من المصفوفات النشطة للكاميرات الفعلية إلى المصفوفة النشطة للكاميرا المنطقية لـ
ANDROID_SCALER_CROP_REGION
وANDROID_CONTROL_AE_REGIONS
وANDROID_CONTROL_AWB_REGIONS
وANDROID_CONTROL_AF_REGIONS
ANDROID_STATISTICS_FACE_LANDMARKS
ANDROID_STATISTICS_FACE_RECTANGLES
المنظور ، نظام الإحداثيات هو حجم الصفيف النشط للكاميرا المنطقية. - إذا كانت الكاميرات العريضة والكاميرات المقربة تدعم التركيز التلقائي ، لكن الكاميرا فائقة السرعة هي تركيز ثابت ، فتأكد من أن الكاميرا المنطقية تعلن عن دعم التركيز التلقائي. يجب أن تحاكي HAL آلة حالة ضبط تلقائي للصورة للكاميرا فائقة الدقة بحيث عندما يتم تصغير التطبيق إلى العدسة فائقة الاتساع ، فإن حقيقة أن الكاميرا المادية الأساسية هي التركيز الثابت على التطبيق ، وآلات حالة التركيز التلقائي لأوضاع التركيز البؤري التلقائي المدعومة العمل كما هو متوقع.
- إذا كانت الكاميرات العريضة والمقربة تدعم 4K @ 60 إطارًا في الثانية ، والكاميرا فائقة السرعة تدعم فقط 4K @ 30 إطارًا في الثانية ، أو 1080 بكسل في 60 إطارًا في الثانية ، ولكن ليس 4K @ 60 إطارًا في الثانية ، فتأكد من أن الكاميرا المنطقية لا تعلن عن 4K @ 60 إطارًا في الثانية. تكوينات الدفق المدعومة. يضمن هذا تكامل إمكانات الكاميرا المنطقية ، مما يضمن أن التطبيق لن يواجه مشكلة عدم تحقيق 4k @ 60 fps بقيمة
ANDROID_CONTROL_ZOOM_RATIO
أقل من 1.
- إذا كانت أحجام المصفوفات النشطة للكاميرات الفعلية مختلفة ، فيجب على الكاميرا HAL إجراء التعيين من المصفوفات النشطة للكاميرات الفعلية إلى المصفوفة النشطة للكاميرا المنطقية لـ
- بدءًا من Android 10 ، لا يلزم وجود كاميرا متعددة منطقية لدعم مجموعات البث التي تتضمن تدفقات فعلية. إذا كان HAL يدعم الدمج مع التدفقات المادية:
- (Android 11 أو أعلى) للتعامل بشكل أفضل مع حالات الاستخدام مثل العمق من الاستريو وتتبع الحركة ، اجعل مجال رؤية مخرجات الدفق المادي كبيرًا بقدر ما يمكن أن تحققه الأجهزة. ومع ذلك ، إذا نشأ دفق فعلي ودفق منطقي من نفس الكاميرا المادية ، فقد تفرض قيود الأجهزة على مجال عرض الدفق المادي ليكون هو نفسه التدفق المنطقي.
- لمعالجة ضغط الذاكرة الناتج عن التدفقات المادية المتعددة ، تأكد من أن التطبيقات تستخدم
discardFreeBuffers
تخصيص المخازن المؤقتة المجانية (المخازن المؤقتة التي تم إصدارها من قبل المستهلك ، ولكن لم يتم إلغاء ترتيبها من قبل المنتج بعد) إذا كان من المتوقع أن يكون الدفق المادي خاملاً لفترة من الوقت. - إذا لم يتم إرفاق التدفقات المادية من الكاميرات الفعلية المختلفة بالطلب نفسه ، فتأكد من استخدام التطبيقات
surface group
بحيث يتم استخدام قائمة انتظار واحدة لدعم سطحين مواجهين للتطبيق ، مما يقلل من استهلاك الذاكرة.