يمكن لشركات تصنيع الأجهزة توفير الإضافات، مثل الخلفية الضبابية ووضع "الصور في الليل" و"النطاق العالي الديناميكية"، للمطوّرين التابعين لجهات خارجية من خلال واجهة "إضافات الكاميرا" التي تقدّمها مكتبة مورّدي المصنّعين الأصليين للأجهزة. يمكن للمطوّرين استخدام Camera2 Extensions API وCameraX Extensions API للوصول إلى الإضافات التي تم تنفيذها في مكتبة موفِّر المصنّع الأصلي للجهاز.
للحصول على قائمة بالإضافات المتوافقة، والتي تكون متطابقة في Camera2 وCameraX، يُرجى الاطّلاع على CameraX Extensions API. إذا أردت إضافة إضافة، يمكنك الإبلاغ عن خطأ باستخدام نظام تتبُّع المشاكل.
توضّح هذه الصفحة كيفية تنفيذ مكتبة المورّد الأصلي للجهاز وتفعيلها على الأجهزة.
هندسة معمارية
يوضّح المخطّط البياني التالي بنية واجهة Camera Extensions
أو extensions-interface
:
الشكل 1: مخطّط بياني لبنية "إضافات الكاميرا"
كما هو موضّح في المخطّط البياني، لتفعيل الإضافات الخاصة بالكاميرا، عليك
تنفيذ extensions-interface
المقدَّمة من مكتبة المورّد الأصلي للجهاز. تفعِّل مكتبة
المورّد الأصلي للجهاز واجهتَي برمجة تطبيقات:
CameraX Extensions API و
Camera2 Extensions API،
اللتان يستخدمهما تطبيقا CameraX وCamera2 على التوالي للوصول إلى
إضافات المورّد.
تنفيذ مكتبة المورّد المصنّع الأصلي للجهاز
لتنفيذ مكتبة المورّد الأصلي للجهاز، انسخ ملفات
camera-extensions-stub
إلى مشروع مكتبة نظام. تحدّد هذه الملفات واجهة Camera Extensions.
تنقسم ملفات camera-extensions-stub
إلى الفئات التالية:
ملفات الواجهة الأساسية (لا تعدِّلها)
PreviewExtenderImpl.java
ImageCaptureExtenderImpl.java
ExtenderStateListener.java
ProcessorImpl.java
PreviewImageProcessorImpl.java
CaptureProcessorImpl.java
CaptureStageImpl.java
RequestUpdateProcessorImpl.java
ProcessResultImpl.java
advanced/AdvancedExtenderImpl.java
advanced/Camera2OutputConfigImpl.java
advanced/Camera2SessionConfigImpl.java
advanced/ImageProcessorImpl.java
advanced/ImageReaderOutputConfigImpl.java
advanced/ImageReferenceImpl.java
advanced/MultiResolutionImageReaderOutputConfigImpl.java
advanced/OutputSurfaceImpl.java
advanced/RequestProcessorImpl.java
advanced/SessionProcessorImpl.java
advanced/SurfaceOutputConfigImpl.java
عمليات التنفيذ الإلزامية (أضِف عملية التنفيذ)
ExtensionVersionImpl.java
InitializerImpl.java
فئات موسّع Bokeh (نفِّذها إذا كانت إضافة Bokeh متوافقة)
BokehImageCaptureExtenderImpl.java
BokehPreviewExtenderImpl.java
advanced/BokehAdvancedExtenderImpl.java
فئات مُمدِّد وقت العروض الليلية (طبِّق هذه الفئات إذا كان وقت عرض "العروض الليلية" متوافقًا)
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
advanced/NightAdvancedExtenderImpl.java
فئات موسّعات المساحة التلقائية (طبِّقها إذا كانت ميزة "التوسيع التلقائي" متاحة)
AutoImageCaptureExtenderImpl.java
AutoPreviewExtenderImpl.java
advanced/AutoAdvancedExtenderImpl.java
فئات موسّعات النطاق العالي الديناميكية (HDR) (طبِّق هذه الفئات إذا كانت موسّعات النطاق العالي الديناميكية متوافقة)
HdrImageCaptureExtenderImpl.java
HdrPreviewExtenderImpl.java
advanced/HdrAdvancedExtenderImpl.java
فئات موسّع ميزة "تجميل الوجه" (يجب تنفيذها إذا كان موسّع ميزة "تجميل الوجه" متوافقًا)
BeautyImageCaptureExtenderImpl.java
BeautyPreviewExtenderImpl.java
advanced/BeautyAdvancedExtenderImpl.java
الأدوات المساعدة (اختيارية ويمكن حذفها)
advanced/Camera2OutputConfigImplBuilder.java
advanced/Camera2SessionConfigImplBuilder.java
لست ملزمًا بتقديم طريقة تنفيذ لكل إضافة. إذا
لم تنفِّذ إضافة، اضبط isExtensionAvailable()
لعرض false
أو
أزِل فئات Extender المقابلة. تُبلغ واجهات برمجة التطبيقات Camera2 وCameraX Extensions
التطبيق بأنّ الإضافة غير متاحة.
لنطّلِع على كيفية تفاعل واجهات برمجة التطبيقات Camera2 وCameraX Extensions مع مكتبة المورّد لتفعيل إضافة. يوضّح المخطّط البياني التالي مسار المعالجة بالكامل باستخدام إضافة "الليل" كمثال:
الشكل 2: تنفيذ الإضاءة الليلية
التحقّق من الإصدار:
تتصل Camera2/X بـ
ExtensionVersionImpl.checkApiVersion()
لضمان توافق الإصدارextensions-interface
الذي نفَّذه المصنّع الأصلي للجهاز مع الإصدارات المتوافقة مع Camera2/X.تهيئة مكتبة المورّد:
يحتوي
InitializerImpl
على طريقةinit()
لإعداد مكتبة المورّد. تُكمِل Camera2/X عملية الإعداد قبل الوصول إلى فئات Extender.إنشاء مثيلات لفئات Extender:
تنشئ مثيلًا لفئات Extender للإضافة. هناك نوعان من أدوات التمديد: "أداة التمديد الأساسية" و"أداة التمديد المتقدّمة". يجب تنفيذ نوع إضافي واحد لجميع الإضافات. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة الموسّع الأساسي مقارنةً بالموسّع المتقدّم.
تنشئ Camera2/X فئات Extender وتتفاعل معها لاسترداد المعلومات وتفعيل الإضافة. بالنسبة إلى إضافة معيّنة، يمكن لـ Camera2/X إنشاء مثيل لفئات Extender عدة مرات. نتيجةً لذلك، لا تُجري عمليات إعداد مكثفة في أسلوب الإنشاء أو في طلب
init()
. لا تُجري العمليات المعقدة إلا عندما تكون جلسة الكاميرا على وشك البدء، مثل عند استدعاءonInit()
في "الموسّع الأساسي" أو عند استدعاءinitSession()
في "الموسّع المتقدّم".بالنسبة إلى إضافة "الليل"، يتم إنشاء مثيلات لفئات "الموسّع" التالية لنوع "الموسّع الأساسي":
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
بالنسبة إلى نوع "الموسّع المتقدّم":
NightAdvancedExtenderImpl.java
التحقّق من مدى توفّر الإضافة:
قبل تفعيل الإضافة، يتحقّق
isExtensionAvailable()
مما إذا كانت الإضافة متاحة في معرّف الكاميرا المحدّد من خلال مثيل "موسّع نطاق الشبكة".إعداد الموسّع باستخدام معلومات الكاميرا:
تُجري Camera2/X مكالمة إلى
init()
في مثيل Extender وتُرسل إليه رقم تعريف الكاميرا وCameraCharacteristics
.معلومات طلب البحث:
تستدعي فئة Extender لاسترداد معلومات، مثل دقة الشاشة المتوافقة، وتسجيل وقت الاستجابة المقدَّر، وتسجيل مفاتيح الطلبات من "الموسّع" استعدادًا لتفعيل الإضافة.
تفعيل الإضافة على الموسّع:
توفّر فئة Extender جميع الواجهات اللازمة لتفعيل الفئة. وتوفّر هذه الواجهة آلية لربط تنفيذ المصنّعين الأصليّين للأجهزة بمسار Camera2، مثل إدخال مَعلمات طلب التقاط الصور أو تفعيل وحدة معالجة ما بعد.
بالنسبة إلى نوع "الموسّع المتقدّم"، تتفاعل Camera2/X مع
SessionProcessorImpl
لتفعيل الإضافة. يسترجع Camera2/X مثيلSessionProcessorImpl
من خلال الاتصال بـcreateSessionProcessor()
في الموسّع.
توضّح الأقسام التالية مسار الإضافة بمزيد من التفصيل.
التحقّق من الإصدار
عند تحميل مكتبة موفِّر الجهاز الأصلي من الجهاز أثناء التشغيل، تتحقق Camera2/X
مما إذا كانت المكتبة متوافقة مع الإصدار extensions-interface
.
يستخدم extensions-interface
التنسيق الدال على الإصدار، أو
MAJOR.MINOR.PATCH، على سبيل المثال، 1.1.0 أو 1.2.0. ومع ذلك، لا يتم استخدام سوى الإصدارين العميق والمصغر أثناء عملية إثبات صحة الإصدار.
للتحقّق من الإصدار، يُجري Camera2/X مكالمة إلى
ExtensionVersionImpl.checkApiVersion()
باستخدام الإصدار المتوافق من
extensions-interface
. بعد ذلك، يستخدِم Camera2/X الإصدار الذي أبلغت عنه مكتبة OEM لتحديد ما إذا كان يمكن تفعيل الإضافة والميزات التي يجب أن تشغّلها.
التوافق مع الإصدارات الرئيسية
إذا كانت الإصدارات الرئيسية من واجهة الإضافات مختلفة بين Camera2/X ومكتبة المورّد، يتم اعتبارها غير متوافقة و يتم إيقاف الإضافة.
التوافق مع الإصدارات السابقة
طالما أنّ الإصدار الرئيسي متطابق، تضمن حِزم Camera2/X
التوافق مع الإصدارات السابقة من مكتبات مورّدي المصنّعين الأصليين للأجهزة التي تم إنشاؤها باستخدام الإصدارات السابقة
extensions-interface
. على سبيل المثال، إذا كان Camera2/X متوافقًا مع الإصدار extensions-interface
1.3.0، ستظل مكتبات مورّدي المصنّعين الأصليين للأجهزة التي نفّذت الإصدار 1.0.0 و
1.1.0 و1.2.0 متوافقة. ويعني ذلك أيضًا أنّه بعد تنفيذ
إصدار محدّد من مكتبة المورّد، تتأكّد Camera2/X من أنّ المكتبة
متوافقة مع الإصدارات السابقة من extension-interface
.
التوافق مع الإصدارات المستقبلية
يعتمد توافق الإصدارات المستقبلية مع مكتبات المورّدين لإصدارات extensions-interface
الأحدث على المصنّع الأصلي للجهاز. إذا كنت بحاجة إلى بعض الميزات لتنفيذ الإضافات،
يمكنك تفعيل الإضافات اعتبارًا من إصدار معيّن. في هذه الحالة، يمكنك عرض الإصدار المتوافق من extensions-interface
عندما يستوفي إصدار مكتبة Camera2/X المتطلبات. إذا كانت إصدارات Camera2/X
غير متوافقة، يمكنك إرجاع إصدار غير متوافق مثل 99.0.0 لمحاولة
إيقاف الإضافات.
بدء مكتبة المورّد
بعد التحقّق من إصدار extensions-interface
الذي نفّذته مكتبة OEM
، تبدأ Camera2/X عملية الإعداد. تُرسِل الطريقة
InitializerImpl.init()
إشارة إلى مكتبة المصنّع الأصلي للجهاز بأنّ أحد التطبيقات يحاول
استخدام الإضافات.
لا تُجري Camera2/X أي طلبات أخرى إلى مكتبة المصنّع الأصلي للجهاز (باستثناء التحقّق من الإصدار)
إلى أن تطلب مكتبة المورّد المصنّع الأصلي للجهاز OnExtensionsInitializedCallback.onSuccess()
إعلامها بإكمال عملية الإعداد.
يجب تنفيذ
InitializerImpl
بدءًا من الإصدار extensions-interface
1.1.0. تتخطّى Camera2/X خطوة بدء مكتبة Camera2/X إذا كانت مكتبة المورّد الأصلي للجهاز تُنفِّذ الإصدار extensions-interface
1.0.0.
موسّع المساحة التخزينية الأساسي مقارنةً بموسّع المساحة التخزينية المتقدّم
هناك نوعان من عمليات تنفيذ extensions-interface
: "الموسّع الأساسي" و"الموسّع المتقدّم". تم توفير "الموسّع المتقدّم" منذ الإصدار extensions-interface
1.2.0.
يجب تنفيذ Basic Extender للإضافات التي تعالج الصور في واجهة HAL للكاميرا أو استخدام وحدة معالجة لاحقة قادرة على معالجة أحداث YUV.
يمكنك استخدام الإضافات المتقدّمة للتطبيقات التي تحتاج إلى تخصيص إعدادات بث Camera2 وإرسال طلبات الالتقاط حسب الحاجة.
اطّلِع على الجدول التالي للمقارنة:
موسّع ذاكرة التخزين الأساسي | موسّع مساحة تخزين متقدّم | |
---|---|---|
إعدادات البث | ثابت المعاينة: PRIVATE أو YUV_420_888 (في حال توفّر معالج) التقاط الصور الثابتة: JPEG أو YUV_420_888 (في حال توفّر معالج)
|
يمكن للمصنّع الأصلي للجهاز تخصيصها. |
إرسال طلب تسجيل | يمكن فقط لتطبيق Camera2/X إرسال طلبات الالتقاط. يمكنك ضبط المَعلمات لتحديد هذه الطلبات. عندما يتم توفير وحدة المعالجة لالتقاط الصور، يمكن لـ Camera2/X إرسال طلبات متعددة لالتقاط الصور وإرسال جميع الصور ونتائج التقاط إلى وحدة المعالجة. | يتم توفير مثيل RequestProcessorImpl لك ل ejecutant تنفيذ طلب التقاط الكاميرا 2 والحصول على النتائج والصورة.
يُطلِق Camera2/X |
العناصر التي يمكن ربطها في مسار الكاميرا |
|
|
الملاءمة | الإضافات التي يتم تنفيذها في واجهة برمجة التطبيقات لوحدة التحكّم في الكاميرا أو في وحدة معالجة تعالج صور YUV |
|
إصدار واجهة برمجة التطبيقات المتوافق | Camera2 Extensions: الإصدار 13 من نظام التشغيل Android أو إصدار أحدث CameraX Extensions: الإصدار camera-extensions 1.1.0 أو إصدار أحدث |
Camera2 Extensions: الإصدار 12L من Android أو إصدار أحدث CameraX Extensions: الإصدار camera-extensions 1.2.0-alpha03 أو إصدار أحدث |
مسارات المستخدمين في التطبيق
يعرض الجدول التالي ثلاثة أنواع من مسارات التطبيقات و طلبات البيانات المقابلة من واجهة برمجة التطبيقات لـ "إضافات الكاميرا". على الرغم من أنّ Camera2/X توفّر IDEs، عليك تنفيذ مكتبة المورّد بشكل صحيح لتتوافق مع هذه IDEs، وسنوضّح ذلك بمزيد من التفصيل في قسم لاحق.
إضافات Camera2 | إضافات CameraX | |
---|---|---|
مدى توفّر إضافات طلبات البحث | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
معلومات طلب البحث | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
تعالج CameraX بقية المعلومات ضمن المكتبة. |
معاينة الصور ولقطات الثابتة مع تفعيل ميزة "التوسيع" | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
موسّع ذاكرة التخزين الأساسي
توفّر واجهة "الموسّع الأساسي" نقاط اتصال في عدة مواضع في مسار معالجة ملف الوسائط في الكاميرا. يحتوي كل نوع من أنواع الإضافات على فئات Extender المقابلة التي يحتاج المصنّعون الأصليون للأجهزة إلى تنفيذها.
يسرد الجدول التالي فئات الموسّعات التي يجب أن تنفذها المصنّعين الأصليّين للأجهزة لكل إضافة:
فئات الموسّعات المطلوب تنفيذها | |
---|---|
الليل | NightPreviewExtenderImpl.java
|
HDR | HdrPreviewExtenderImpl.java
|
تلقائي | AutoPreviewExtenderImpl.java
|
تأثير "موهبة" | BokehPreviewExtenderImpl.java
|
تجميل الوجه | BeautyPreviewExtenderImpl.java
|
نستخدم PreviewExtenderImpl
وImageCaptureExtenderImpl
كعنصرَين نائبَين
في المثال التالي. استبدِل هذه الأسماء بأسماء
الملفات الفعلية التي يتم تنفيذها.
تتوفر لـ "الموسّع الأساسي" الإمكانات التالية:
- أدرِج مَعلمات الجلسة عند ضبط
CameraCaptureSession
(onPresetSession
). - إرسال إشعار إليك عند بدء جلسة الالتقاط وإرسال أحداث الإغلاق وإرسال طلب واحد
لإعلام HAL بالمَعلمات المعروضة (
onEnableSession
،onDisableSession
). - أدخِل مَعلمات التسجيل للطلب
(
PreviewExtenderImpl.getCaptureStage
،ImageCaptureExtenderImpl.getCaptureStages
). - أضِف معالجات لمعاينة المحتوى وتسجيله في الوقت نفسه، ويجب أن تكون قادرة على معالجة مجرى
YUV_420_888
.
لنلقِ نظرة على كيفية استدعاء Camera2/X لـ extensions-interface
لتحقيق مسارات التطبيقات الثلاثة المذكورة أعلاه.
مسار التطبيق 1: التحقّق من توفّر الإضافة
الشكل 3: مسار التطبيق 1 على أداة Basic Extender
في هذه العملية، تستدعي Camera2/X مباشرةً طريقة isExtensionAvailable()
في كلاPreviewExtenderImpl
وImageCaptureExtenderImpl
بدون استدعاءinit()
. يجب أن تُعرِض كلتا فئتَي Extender القيمة true
لتفعيل الإضافات.
غالبًا ما تكون هذه هي الخطوة الأولى التي تتّخذها التطبيقات للتحقّق مما إذا كان نوع التمديد المُعطى متوافقًا مع رقم تعريف كاميرا معيّن قبل تفعيل التمديد. ويعود سبب ذلك إلى أنّ بعض الإضافات لا تتوفّر إلا مع أرقام تعريف كاميرات معيّنة.
مسار التطبيق 2: طلب المعلومات
الشكل 4: مسار التطبيق 2 على أداة التمديد الأساسية
بعد تحديد ما إذا كانت الإضافة متاحة، يجب أن تطلب التطبيقات المعلومات التالية قبل تفعيل الإضافة.
نطاق وقت الاستجابة لالتقاط الصور الثابتة:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
يعرض نطاق وقت الاستجابة لالتقاط الصور الثابتة ليتمكّن التطبيق من تقييم ما إذا كان من المناسب تفعيل الإضافة للسيناريو الحالي.الأحجام المتوافقة لسطح المعاينة والالتقاط: يعرض العنصران
ImageCaptureExtenderImpl.getSupportedResolutions
وPreviewExtenderImpl.getSupportedResolutions
قائمة بتنسيقات الصور والأحجام المتوافقة لتنسيق السطح وحجمه.مفاتيح الطلبات والنتائج المتوافقة: تستدعي Camera2/X الطرق التالية لاسترداد مفاتيح طلبات التقاط المتوافقة ومفاتيح النتائج من عملية التنفيذ:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
تُطلِق Camera2/X دائمًا init()
أولاً على فئات Extender هذه قبل الاستعلام
لمزيد من المعلومات.
مسار التطبيق 3: معاينة/التقاط الصور الثابتة مع تفعيل الإضافة (تنفيذ HAL)
الشكل 5: مسار التطبيق 3 على أداة Basic Extender
يوضّح المخطّط البياني أعلاه المسار الرئيسي لتفعيل ميزة المعاينة والتقاط الصور الثابتة باستخدام إضافة بدون أي وحدة معالجة. وهذا يعني أنّ واجهة HAL للكاميرا تعالج الإضافة.
في هذه العملية، يتصل تطبيق Camera2/X أولاً بـ init()
ثم بـ onInit
، ما يُعلمك بأنّ جلسة الكاميرا على وشك البدء باستخدام الإضافات المحدّدة.
يمكنك إجراء عمليات الإعداد المكثفة في onInit()
.
عند ضبط CameraCaptureSession
، يُطلِق Camera2/X
onPresetSession
للحصول على مَعلمات الجلسة. بعد إتمام برمجة جلسة الالتقاط، تستدعي Camera2/X onEnableSession
لعرض مثيل
CaptureStageImpl
يحتوي على مَعلمات الالتقاط. تُرسِل Camera2/X
على الفور طلبًا واحدًا يتضمّن مَعلمات الالتقاط هذه لإعلام
HAL. وبالمثل، قبل إغلاق جلسة الالتقاط، تستدعي Camera2/X دالة
onDisableSession
ثم تُرسِل طلبًا واحدًا مع مَعلمات التقاط
المُرسَلة.
يحتوي الطلب المتكرّر الذي تسبّبت فيه Camera2/X على مَعلمات الطلب
التي عرضها PreviewExtenderImpl.getCaptureStage()
. بالإضافة إلى ذلك، يحتوي طلب التقاط الصور الثابتة على المَعلمات التي يعرضها
ImageCaptureExtenderImpl.getCaptureStages()
.
أخيرًا، يُطلِق Camera2/X onDeInit()
بعد انتهاء جلسة الكاميرا.
يمكنك إلغاء حجز الموارد في onDeinit()
.
معالج المعاينة
بالإضافة إلى HAL للكاميرا، يمكنك أيضًا تنفيذ الإضافات في وحدة معالجة.
نفِّذ PreviewExtenderImpl.getProcessorType
لتحديد نوع المعالج
على النحو الموضّح أدناه:
PROCESSOR_TYPE_NONE
: لا يتوفّر معالج. تتم معالجة الصور في معالج معالجة الصور بالكاميرا (HAL).PROCESSOR_TYPE_REQUEST_UPDATE_ONLY
: يتيح لك نوع المعالج تعديل الطلب المتكرّر باستخدام مَعلمات طلب التسجيل الجديدة استنادًا إلى أحدثTotalCaptureResult
.يجب أن يعرض
PreviewExtenderImpl.getProcessor
مثيلًاRequestUpdateProcessorImpl
يعالج مثيلTotalCaptureResult
ويعرض مثيلًاCaptureStageImpl
لتعديل الطلب المتكرّر. يجب أن يعرض الحقلPreviewExtenderImpl.getCaptureStage()
أيضًا نتيجة المعالجة وأن يعرض أحدث قيمةCaptureStageImpl
.
PROCESSOR_TYPE_IMAGE_PROCESSOR
: يتيح لك هذا النوع تنفيذ معالج لمعالجة صورYUV_420_888
وكتابة الإخراج على سطحPRIVATE
.عليك تنفيذ مثيل
PreviewImageProcessorImpl
وإرجاعه فيPreviewExtenderImpl.getProcessor
. يكون المعالج مسؤولاً عن معالجةYUV_420_888
صورة إدخال. من المفترض أن يتم كتابة النتيجة بتنسيقPRIVATE
للمعاينة. يستخدم Camera2/X سطحYUV_420_888
بدلاً منPRIVATE
لضبطCameraCaptureSession
لمعاينة المحتوى.اطّلِع على الرسم التوضيحي التالي لمعرفة الخطوات التي يجب اتّباعها:
الشكل 6: معاينة البث المباشر مع PreviewImageProcessorImpl
توفّر واجهة PreviewImageProcessorImpl
ProcessImpl
وتحتوي على
ثلاث طرق مهمة:
onOutputSurface(Surface surface, int imageFormat)
تُحدِّد سطح الإخراج للمعالج. بالنسبة إلىPreviewImageProcessorImpl
، يكونimageFormat
تنسيقًا للبكسل مثلPixelFormat.RGBA_8888
.تُستخدَم
onResolutionUpdate(Size size)
لضبط حجم الصورة المُدخلة.onImageFormatUpdate(int imageFormat)
تُستخدَم لضبط تنسيق الصورة المُدخلة. لا يمكن حاليًا استخدام أي رمز آخر غيرYUV_420_888
.
معالج التقاط الصور
لالتقاط الصور الثابتة، يمكنك تنفيذ وحدة معالجة عن طريق عرض مثيل
CaptureProcessorImpl
باستخدام ImageCaptureExtenderImpl.getCaptureProcessor
. يكون المعالج مسؤولاً عن معالجة قائمة بصور YUV_420_888
ومثيلات TotalCaptureResult
التي تم التقاطها وكتابة الإخراج على سطح YUV_420_888
.
يمكنك افتراض أنّ ميزة المعاينة مفعّلة وقيد التشغيل قبل إرسال طلب التقاط الصور الثابتة.
يمكنك الاطّلاع على العملية في المخطّط البياني أدناه:
الشكل 7: لا يزال بإمكانك تسجيل الخطوات باستخدام CaptureProcessorImpl
.
يستخدم Camera2/X مساحة عرض بتنسيق
YUV_420_888
لالتقاط الصور الثابتة من أجل ضبط جلسة الالتقاط. تُعدّ Camera2/XCaptureProcessorImpl
من خلال الاتصال بما يلي:CaptureProcessorImpl.onImageFormatUpdate()
معYUV_420_888
CaptureProcessorImpl.onResolutionUpdate()
مع حجم الصورة المُدخلة.CaptureProcessorImpl.onOutputSurface()
مع سطحYUV_420_888
ناتج
يعرض
ImageCaptureExtenderImpl.getCaptureStages
قائمة بعناصرCaptureStageImpl
، حيث يتم ربط كل عنصر بمثيلCaptureRequest
مع مَعلمات الالتقاط التي ترسلها Camera2/X. على سبيل المثال، إذا أعادت الواجهة قائمة بثلاثة مثيلاتCaptureStageImpl
، تُرسِل Camera2/X ثلاثة طلبات لالتقاط الصور مع مَعلمات الالتقاط المقابلة باستخدام واجهة برمجة التطبيقاتcaptureBurst
.يتم تجميع الصور التي تم استلامها ومثيلات
TotalCaptureResult
معًا وإرسالها إلىCaptureProcessorImpl
لمعالجتها.يُسجِّل
CaptureProcessorImpl
صورة النتيجة (بتنسيقYUV_420_888
) في سطح الإخراج الذي يحدّده طلبonOutputSurface()
. ويحوّل Camera2/X هذه الصور إلى صور JPEG إذا لزم الأمر.
إتاحة مفاتيح طلبات الالتقاط ونتائجها
بالإضافة إلى معاينة الكاميرا وتصويرها، يمكن للتطبيقات ضبط إعدادات التكبير/التصغير أو مَعلمات الفلاش أو تفعيل ميزة "النقر للتركيز". قد لا تكون هذه المَعلمات متوافقة مع طريقة تنفيذ الإضافة.
تمت إضافة الطرق التالية إلى الإصدار extensions-interface
1.3.0 للسماح
لك بعرض المَعلمات التي يتيح تنفيذها:
- تُعرِض
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
مفاتيح طلبات التسجيل المتوافقة مع عملية التنفيذ. - تعرض دالة
ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
مفاتيح نتائج الالتقاط التي تتضمّنها نتيجة الالتقاط.
إذا كان واجهة برمجة التطبيقات لوحدة التحكّم في الأجهزة (HAL) للكاميرا يعالج الإضافة، ستسترجع Camera2/X نتائج الالتقاط
في CameraCaptureSession.CaptureCallback
. ومع ذلك، إذا
تم تنفيذ المعالج، ستسترجع Camera2/X نتائج الالتقاط في
ProcessResultImpl
، والتي يتم تمريرها إلى process()
الطريقة في
PreviewImageProcessorImpl
و
CaptureProcessorImpl
.
تكون أنت المسؤول عن الإبلاغ عن نتيجة الالتقاط من خلال ProcessResultImpl
إلى Camera2/X.
يمكنك الاطّلاع على تعريف واجهة CaptureProcessorImpl
أدناه كمثال.
في الإصدار extensions-interface
1.3.0 أو الإصدارات الأحدث، يتم استدعاء طلب process()
الثاني:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
بالنسبة إلى عمليات الكاميرا الشائعة، مثل التكبير والتصغير والنقر للتركيز والفلاش وتعويض قياس الإضاءة، ننصحك بتفعيل المفاتيح التالية لكل من طلب التقاط الصور ونتيجة الالتقاط:
- التكبير/التصغير:
CaptureRequest#CONTROL_ZOOM_RATIO
CaptureRequest#SCALER_CROP_REGION
- النقر للتركيز:
CaptureRequest#CONTROL_AF_MODE
CaptureRequest#CONTROL_AF_TRIGGER
CaptureRequest#CONTROL_AF_REGIONS
CaptureRequest#CONTROL_AE_REGIONS
CaptureRequest#CONTROL_AWB_REGIONS
- Flash:
CaptureRequest#CONTROL_AE_MODE
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
CaptureRequest#FLASH_MODE
- توازن التعرّض للضوء:
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
بالنسبة إلى أدوات التوسيع الأساسية التي تستخدم الإصدار 1.2.0 أو الإصدارات الأقدم، تتيح CameraX
Extensions API جميع المفاتيح المذكورة أعلاه بشكل صريح. بالنسبة إلى الإصدار
extensions-interface
1.3.0، يحترم كلّ من CameraX وCamera2 القائمة المعروضة ويتوافقان مع المفاتيح الواردة فيها فقط. على سبيل المثال، إذا قرّرت عرض CaptureRequest#CONTROL_ZOOM_RATIO
وCaptureRequest#SCALER_CROP_REGION
فقط في عملية التنفيذ 1.3.0، يعني ذلك أنّه لا يمكن استخدام ميزة التكبير/التصغير في التطبيق إلا أنّه لا يمكن استخدام ميزة النقر للتركيز والفلاش وميزة التعويض عن الإضاءة.
موسّع مساحة تخزين متقدّم
"الموسّع المتقدّم" هو نوع من عمليات تنفيذ المورّدين المستندة إلى Camera2 API.
تمت إضافة نوع الموسّع هذا في الإصدار extensions-interface
1.2.0. استنادًا إلى
الشركة المصنِّعة للجهاز، قد يتم تنفيذ الإضافات في طبقة التطبيق،
وذلك استنادًا إلى العوامل التالية:
إعداد مجموعات البث المخصّصة: يمكنك إعداد مجموعات بث مخصّصة، مثل مجموعة بث RAW، أو إنشاء مجموعات بث متعددة لمعرّفات كاميرات مادية مختلفة.
إمكانية إرسال طلبات Camera2: يجب أن تتيح هذه الواجهة منطق تفاعل معقدًا يمكنه إرسال طلبات التقاط الصور باستخدام مَعلمات استنادًا إلى نتائج الطلبات السابقة.
يوفّر "الموسّع المتقدّم" غلافًا أو طبقة وسيطة، ما يتيح لك تخصيص إعدادات البث وإرسال طلبات التسجيل عند الطلب.
الملفات المطلوب تنفيذها
للتبديل إلى تنفيذ "الموسّع المتقدّم"، يجب أن تُعرِض isAdvancedExtenderImplemented()
في
ExtensionVersionImpl
true
. يجب أن تنفّذ المصنّعين الأصليّين للأجهزة فئات "الموسّع" المناسبة لكل نوع من أنواع الإضافات. يمكن العثور على ملفات تنفيذ "الموسّع المتقدّم"
في حزمة advanced.
فئات الموسّعات المطلوب تنفيذها | |
---|---|
الليل | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
تلقائي | advanced/AutoAdvancedExtenderImpl.java
|
تأثير "موهبة" | advanced/BokehAdvancedExtenderImpl.java
|
تجميل الوجه | advanced/BeautyAdvancedExtenderImpl.java
|
نستخدم AdvancedExtenderImpl
كعنصر نائب في المثال التالي.
استبدِله باسم ملف Extender الخاص بالإضافة التي يتم
تنفيذها.
لنلقِ نظرة على كيفية استدعاء Camera2/X لـ extensions-interface
لتحقيق مسارات المعالجة
الثلاث للتطبيقات.
مسار التطبيق 1: التحقّق من توفّر الإضافات
الشكل 8: مسار التطبيق 1 على أداة "إضافات متقدّمة"
أولاً، يتحقّق التطبيق من توفّر امتداد معيّن.
مسار التطبيق 2: طلب المعلومات
الشكل 9: مسار التطبيق 2 على أداة التمديد المتقدّمة
بعد الاتصال بـ AdvancedExtenderImpl.init()
، يمكن للتطبيق طلب
المعلومات التالية من AdvancedExtenderImpl
:
وقت الاستجابة المقدَّر لالتقاط الصور الثابتة:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
يعرض النطاق الزمني لوقت الاستجابة لالتقاط الصور الثابتة ليتمكّن التطبيق من تقييم ما إذا كان من المناسب تفعيل الإضافة للسيناريو الحالي.درجات الدقة المتوافقة مع ميزة المعاينة وميزة التقاط الصور الثابتة:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
تعرِض خريطة لتنسيق الصورة إلى قائمة الأحجام المتوافقة مع تنسيق سطح المعاينة وحجمه. يجب أن تتيح المصنّعين الأصليّين للأجهزة استخدام تنسيقPRIVATE
على الأقل.تعرض
AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
التنسيقات والأحجام المتوافقة لسطح الالتقاط الثابت. يجب أن تتيح المصنّعين الأصليين للأجهزة إمكانية استخدام التنسيقَينJPEG
وYUV_420_888
.تعرض
AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
الأحجام المتوافقة لمصدرYUV_420_888
إضافي لتحليل الصور. إذا كانت سطح YUV لتحليل الصور غير متوافقة، من المفترض أن يعرضgetSupportedYuvAnalysisResolutions()
null
أو قائمة فارغة.
مفاتيح/نتائج طلبات الالتقاط المتاحة (تمت إضافتها في الإصدار
extensions-interface
1.3.0): تستدعي Camera2/X الطرق التالية لاسترداد مفاتيح طلبات الالتقاط ومقاييس النتائج المتوافقة من عملية التنفيذ:AdvancedExtenderImpl.getAvailableCaptureRequestKeys
AdvancedExtenderImpl.getAvailableCaptureResultKeys
لمزيد من المعلومات، يُرجى الاطّلاع على دعم مفاتيح طلب التسجيل والنتائج.
مسار التطبيق 3: معاينة/التقاط الصور الثابتة مع تفعيل الإضافة
الشكل 10: مسار التطبيق 3 على أداة التمديد المتقدّمة
يعرض الرسم البياني أعلاه المسار الرئيسي لبدء المعاينة وتسجيل الصور الثابتة لنوع "الموسّع المتقدّم". لنطّلِع على كل خطوة.
مثيل
SessionProcessorImpl
يتم تنفيذ وظائف "الموسّع المتقدّم" الأساسية في
SessionProcessorImpl
، وهو المسؤول عن توفير إعدادات جلسة مخصّصة وإرسال طلبات التسجيل لبدء المعاينة وطلب التسجيل الثابت. يتمّ استدعاءAdvancedExtenderImpl.createSessionProcessor()
لعرض مثيلSessionProcessorImpl
.initSession
SessionProcessorImpl.initSession()
يبدأ الجلسة للإضافة. في هذا القسم، يمكنك تخصيص الموارد وعرض إعدادات جلسة لإعدادCameraCaptureSession
.بالنسبة إلى مَعلمات الإدخال، تحدِّد Camera2/X إعدادات سطح الإخراج لمعاينة الصور وتصويرها وتحليل الصور الاختياري بتنسيق YUV. يحتوي إعداد سطح الإخراج (
OutputSurfaceImpl
) هذا على سطح العرض والحجم وتنسيق الصورة التي يتم استرجاعها من خلال الطرق التالية فيAdvancedExtenderImpl
:getSupportedPreviewOutputResolutions()
getSupportedCaptureOutputResolutions()
getSupportedYuvAnalysisResolutions()
يجب عرض مثيل
Camera2SessionConfigImpl
يتكوّن من قائمة بمثيلاتCamera2OutputConfigImpl
ومَعلمات الجلسة المستخدَمة لضبطCameraCaptureSession
. تكون أنت المسؤول عن عرض صور الكاميرا الصحيحة على مساحات العرض التي تم تمريرها من خلال Camera2/X. في ما يلي بعض الخيارات لتفعيل الإخراج:- المعالجة في واجهة برمجة التطبيقات لكاميرا HAL: يمكنك إضافة مساحات العرض للإخراج مباشرةً
إلى
CameraCaptureSession
باستخدام عملية تنفيذSurfaceOutputConfigImpl
. يؤدي ذلك إلى ضبط سطح الإخراج المقدَّم على مسار تدفق الكاميرا والسماح لطبقة HAL للكاميرا بمعالجة الصورة. معالجة سطح
ImageReader
الوسيط (RAW أو YUV أو غير ذلك): أضِف مساحات عرضImageReader
الوسيطة إلىCameraCaptureSession
باستخدام مثيلImageReaderOutputConfigImpl
.عليك معالجة الصور الوسيطة وكتابة صورة النتيجة في سطح الإخراج.
- استخدام ميزة مشاركة سطح العرض في Camera2: يمكنك استخدام ميزة مشاركة سطح العرض مع سطح عرض آخر
من خلال إضافة أي مثيل
Camera2OutputConfigImpl
إلىgetSurfaceSharingOutputConfigs()
في مثيلCamera2OutputConfigImpl
آخر. يجب أن يكون تنسيق السطح وحجمه متطابقَين.
يجب أن يكون لكل
Camera2OutputConfigImpl
، بما في ذلكSurfaceOutputConfigImpl
وImageReaderOutputConfigImpl
، معرّف فريد (getId()
) يتم استخدامه لتحديد السطح المستهدَف واسترداد الصورة منImageReaderOutputConfigImpl
.
onCaptureSessionStart
وRequestProcessorImpl
عند بدء تشغيل
CameraCaptureSession
واستدعاء إطار عمل Camera لتحميلonConfigured()
، يستدعي Camera2/XSessionProcessorImpl.onCaptureSessionStart()
باستخدامRequestProcessImpl
، وهو ملف لفِّ الطلبات في Camera2. تُنفِّذ Camera2/X واجهة برمجة التطبيقاتRequestProcessImpl
، التي تتيح لك تنفيذ طلبات الالتقاط، و استرداد الصور في حال استخدام واجهة برمجة التطبيقاتImageReaderOutputConfigImpl
.تتشابه واجهات برمجة التطبيقات
RequestProcessImpl
مع واجهات برمجة التطبيقات Camera2CameraCaptureSession
من حيث تنفيذ الطلبات. في ما يلي الاختلافات:- يتم تحديد المساحة المستهدَفة من خلال معرّف مثيل
Camera2OutputConfigImpl
. - إمكانية استرداد صورة
ImageReader
يمكنك الاتصال بالرقم
RequestProcessorImpl.setImageProcessor()
باستخدام معرّفCamera2OutputConfigImpl
محدّد لتسجيل مثيلImageProcessorImpl
بهدف تلقّي الصور.تصبح نسخة
RequestProcessImpl
غير صالحة بعد أن تتصل Camera2/XSessionProcessorImpl.onCaptureSessionEnd()
.- يتم تحديد المساحة المستهدَفة من خلال معرّف مثيل
بدء المعاينة والتقاط صورة
في عملية تنفيذ "الموسّع المتقدّم"، يمكنك إرسال طلبات التسجيل من خلال واجهة
RequestProcessorImpl
. يُعلمك Camera2/X بضرورة بدء طلب المعاينة المتكرّر أو تسلسل التقاط الصور الثابتة من خلال استدعاءSessionProcessorImpl#startRepeating
وSessionProcessorImpl#startCapture
على التوالي. يجب إرسال طلبات التقاط لاستيفاء طلبات المعاينة والصور الثابتة هذه.تضبط Camera2/X أيضًا مَعلمات طلب الالتقاط من خلال
SessionProcessorImpl#setParameters
. يجب ضبط مَعلمات الطلب هذه (إذا كانت المَعلمات متاحة) في كلّ من الطلبات المتكرّرة والطلبات الفردية.يجب أن تتيح
CaptureRequest.JPEG_ORIENTATION
وCaptureRequest.JPEG_QUALITY
على الأقل.extensions-interface
يتيح الإصدار 1.3.0 مفاتيح الطلب والنتيجة، والتي يتم عرضها من خلال الطرق التالية:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
عندما يضبط المطوّرون المفاتيح في قائمة
getAvailableCaptureRequestKeys
، يجب تفعيل المَعلمات والتأكّد من أنّ نتيجة الالتقاط تحتوي على المفاتيح في قائمةgetAvailableCaptureResultKeys
.startTrigger
يتمّ استدعاء
SessionProcessorImpl.startTrigger()
لبدء عامل التفعيل، مثلCaptureRequest.CONTROL_AF_TRIGGER
وCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
. يمكنك تجاهل أي مفاتيح طلبات تسجيل لم يتم الإعلان عنها فيAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
.تم إتاحة
startTrigger()
منذ الإصدار 1.3.0 منextensions-interface
. ويسمح للتطبيقات بتنفيذ ميزة "النقر للتركيز" وفلاش الإضافات.التنظيف
عند إنهاء جلسة تسجيل، يتم استدعاء
SessionProcessorImpl.onCaptureSessionEnd()
قبل إغلاقCameraCaptureSession
. بعد إغلاق جلسة الالتقاط، يُجريdeInitSession()
عملية التنظيف.
أن تتيح معاينة الصور وتصويرها وتحليلها
يجب تطبيق الإضافة لكلّ من حالات استخدام المعاينة والصور الثابتة. ومع ذلك، إذا كان وقت الاستجابة مرتفعًا جدًا بحيث لا يمكن عرض المعاينة بسلاسة، يمكنك تطبيق الإضافة فقط لالتقاط الصور الثابتة.
بالنسبة إلى نوع "الموسّع الأساسي"، بغض النظر عن تفعيل الإضافة لمعاينتها،
يجب تنفيذ كل من ImageCaptureExtenderImpl
وPreviewExtenderImpl
لإضافة معيّنة. غالبًا ما يستخدم التطبيق أيضًا بثًا بتنسيق YUV لتحليل
محتوى الصورة، مثل العثور على رموز الاستجابة السريعة أو النصوص. لدعم حالة الاستخدام هذه بشكل أفضل،
، يجب أن تتيح بث معاينة الصور ولقطات الصور الثابتة وبث
YUV_420_888
لضبط CameraCaptureSession
. وهذا يعني
أنّه في حال استخدام وحدة معالجة، عليك إتاحة بث
مجموعة من ثلاثة أحداث بث YUV_420_888
.
بالنسبة إلى "الموسّع المتقدّم"، تُرسِل Camera2/X ثلاث مساحات عرض إلى دعوة
SessionProcessorImpl.initSession()
. وتكون مساحات العرض هذه مخصّصة لمعاينة
الصور الثابتة وتحليلها وتصويرها، على التوالي. يجب التأكّد من أنّ مساحات عرض معاينة
وتسجيل الشاشة تعرض النتيجة الصالحة. ومع ذلك، بالنسبة إلى مساحة عرض ناتج تحليل
الصور، تأكَّد من أنّها تعمل فقط عندما تكون غير فارغة. إذا لم يكن بإمكان عملية التنفيذ استخدام بث تحليل الصور، يمكنك عرض قائمة
فارغة في AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
. يضمن ذلك أنّ سطح إخراج تحليل الصور يكون دائمًا فارغًا في
SessionProcessorImpl.initSession()
.
إتاحة تسجيل الفيديو
لا تتيح بنية Camera Extension الحالية سوى حالات استخدام المعاينة والتصوير الساكن. لا نتيح تفعيل الإضافة على مساحتَي العرض MediaCodec
أو MediaRecorder
لتسجيل الفيديو. ومع ذلك، يمكن للتطبيقات تسجيل المحتوى الذي يتم عرضه في المعاينة.
نحن ننظر في إمكانية إتاحة مساحات العرض MediaCodec
وMediaRecorder
.
البيانات الوصفية الخاصة باإضافة
في الإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، تتيح البيانات الوصفية الخاصة بالإضافة
لعملاء إضافات الكاميرا ضبط إعدادات طلب التقاط
الصور والحصول عليها، وذلك حسب نوع الإضافة. على وجه التحديد، يمكن لعملاء إضافة الكاميرا
استخدام المَعلمة EXTENSION_STRENGTH
لطلب الالتقاط للتحكّم
في قوة الإضافة وEXTENSION_CURRENT_TYPE
نتيجة الالتقاط لتحديد
نوع الإضافة المفعَّلة.
طلبات الالتقاط
تتحكم مَعلمة طلب الالتقاط
EXTENSION_STRENGTH
في قوة تأثير المعالجة اللاحقة للإضافة. تتضمّن نتيجة الالتقاط المقابلة قيمة القوة التلقائية إذا لم يضبط العميل هذه المَعلمة
بشكل صريح. يمكن تطبيق هذه المَعلمة على النحو التالي لأنواع التوسّعات التالية:
BOKEH
: للتحكّم في مقدار التمويهHDR
وNIGHT
: للتحكّم في عدد الصور التي يتم دمجها ودرجة سطوع الصورة النهائيةFACE_RETOUCH
: تتحكّم هذه الإعدادات في مقدار التحسين التجميلي للبشرة ومحو التجاعيد.
النطاق المسموح به للمَعلمة EXTENSION_STRENGTH
هو بين 0
و
100
، مع الإشارة إلى أنّ 0
يشير إلى عدم معالجة الإضافة أو تمريرها ببساطة، و100
يشير إلى الحد الأقصى لقوة الإضافة لتأثير المعالجة.
لإضافة إمكانية استخدام EXTENSION_STRENGTH
، استخدِم واجهات برمجة التطبيقات الخاصة بالمَعلمات
والمُقدَّمة من المورّد في الإصدار 1.3.0 من واجهة مكتبة الإضافة. لمزيد من المعلومات، يُرجى الاطّلاع على
getAvailableCaptureRequestKeys()
.
تسجيل النتائج
تتيح نتيجة الالتقاط
EXTENSION_CURRENT_TYPE
لعمليات تنفيذ الإضافات إرسال إشعارات إلى العملاء بشأن نوع الإضافة
النشط.
بما أنّ الإضافات التي تستخدم النوع AUTO
تتبدّل ديناميكيًا بين أنواع
الإضافات، مثل HDR
وNIGHT
، استنادًا إلى ظروف المشهد، يمكن لتطبيقات
إضافات الكاميرا استخدام EXTENSION_CURRENT_TYPE
لعرض معلومات عن
الإضافة الحالية التي اختَرتها إضافة AUTO
.
تقدير وقت الاستجابة لالتقاط الصور الثابتة في الوقت الفعلي
في الإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، يمكن لعملاء الإضافات التي تتعامل مع الكاميرا
الاستعلام عن تقديرات وقت استجابة التقاط الصور الثابتة في الوقت الفعلي استنادًا إلى المشهد و
ظروف البيئة باستخدام
getRealtimeStillCaptureLatency()
. توفّر هذه
الطريقة تقديرات أكثر دقة من الأسلوب الثابت
getEstimatedCaptureLatencyRangeMillis()
. استنادًا إلى تقدير وقت الاستجابة، يمكن للتطبيقات اختيار تخطّي معالجة التمديد أو عرض إشارة لإعلام المستخدمين بعملية تتم تنفيذها لفترة طويلة.
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
لتفعيل تقديرات وقت الاستجابة لالتقاط الصور الثابتة في الوقت الفعلي، نفِّذ يلي:
- الإضافات الأساسية:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- الإضافات المتقدّمة:
SessionProcessorImpl.getRealtimeCaptureLatency
تسجيل عمليات تسجيل المكالمات لرصد مستوى التقدّم في المعالجة
في الإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، يمكن لعملاء الإضافات التي تُستخدم مع الكاميراتلقّي عمليات استدعاء للاطّلاع على مستوى تقدّم عمليات معالجة الصور الثابتة التي تستغرق وقتًا طويلاً. يمكن للتطبيقات عرض مستوى التقدّم الحالي للمستخدمين لتحسين تجربتهم بشكل عام.
يمكن للتطبيقات استخدام الرمز البرمجي التالي لدمج هذه الميزة:
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
لتمكين عمليات ردّ الاتصال المتعلّقة بتقدّم معالجة الالتقاط، يجب أن يُجري موفّر الإضافة تنفيذًا لعمليات ردّ الاتصال التالية باستخدام قيمة التقدّم الحالية:
- الإضافات الأساسية:
ProcessResultImpl.onCaptureProcessProgressed()
- الإضافات المتقدّمة:
CaptureCallback.onCaptureProcessProgressed()
التقاط لقطة ثابتة للإجراء بعد المشاهدة
في الإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، يمكن لإضافات الكاميرا
توفير معاينة بعد الالتقاط (صورة المعاينة) باستخدام
setPostviewOutputConfiguration
.
لتحسين تجربة المستخدم، يمكن للتطبيقات عرض صورة ما بعد المشاهدة كأحد
العناصر النائبة عندما تواجه إضافة وقت استجابة متزايد في المعالجة،
وتستبدل الصورة عندما تصبح الصورة النهائية متاحة. يمكن للتطبيقات ضبط
وإصدار طلبات تسجيل بيانات ما بعد المشاهدة باستخدام الرمز المرجعي التالي:
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
لتفعيل ميزة "التقاط الصور الثابتة بعد المشاهدة"، يجب أن يتضمّن تنفيذ المورّد ما يلي:
الإضافات الأساسية:
CaptureProcessorImpl.onPostviewOutputSurface
وCaptureProcessorImpl.processWithPostview
الإضافات المتقدّمة:
SessionProcessorImpl.startCaptureWithPostview
إتاحة إخراج SurfaceView
في الإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، يمكن لعملاء تطبيقات إضافة الكاميرا
استخدام مسارات عرض المعاينة المحسّنة من حيث الطاقة والأداء من خلال تسجيل مثيل
SurfaceView
لإخراج المعاينة لطلبات المعاينة المتكررة.
لتتمكّن من إخراج SurfaceView
، يجب أن يكون تنفيذ إضافة المورّد قادرًا على
بث المعاينة وإخراجها إلى نُسخ SurfaceView
. للتأكّد من توفّر هذه الميزة، يمكنك تشغيل وحدة SurfaceViewExtensionPreviewTest.java
CTS.
أنواع الجلسات الخاصة بالمورّد
تتيح الميزة لعمليات تنفيذ إضافات المورّدين اختيار نوع جلسة خاص بالمورّد سيتم ضبطه في جلسة الالتقاط بالكاميرا الداخلية بدلاً من القيمة التلقائية.
تعمل الميزة بالكامل ضمن إطار العمل ومجموعة المورّدين، ولا تؤثّر في واجهة برمجة التطبيقات الظاهرة للعملاء أو للجمهور.
لاختيار نوع جلسة خاص بالمورّد، نفِّذ ما يلي لمكتبات الإضافات:
* ExtenderStateListener.onSessionType()
للإضافات الأساسية
* Camera2SessionConfigImpl.getSessionType()
للإضافات المتقدّمة
سجلّ إصدارات واجهة الإضافات
يعرض الجدول التالي سجلّ إصدارات واجهة "إضافة الكاميرا". يجب تنفيذ مكتبة المورّد دائمًا باستخدام أحدث إصدار.
الإصدار | الميزات المُضافة |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
التنفيذ المرجعي
تتوفّر عمليات تنفيذ مكتبة المورّد المصنّع الأصلي للسيارة المرجعية التالية في
frameworks/ex
.
advancedSample
: تنفيذ أساسي لميزة "الموسّع المتقدم"sample
: تنفيذ أساسي لـ "موسّع مساحة التخزين الأساسي"service_based_sample
: عملية تنفيذ توضّح كيفية استضافة إضافات الكاميرا فيService
. يحتوي هذا التنفيذ على المكوّنات التالية:
oem_library
: مكتبة المصنّعين الأصليّين للأجهزة (OEM) لإضافات الكاميرا لواجهات برمجة التطبيقات Camera2 وCameraX Extensions API التي تنفِّذExtensions-Interface
ويعمل هذا الإجراء كآلية توجيه تهدف إلى إعادة توجيه المكالمات منExtensions-Interface
إلى الخدمة. توفّر هذه المكتبة أيضًا ملفات AIDL وفئات ملفّات التفاف للتواصل مع الخدمة.يكون "الموسّع المتقدّم" مفعَّلاً تلقائيًا. لتفعيل "الموسّع الأساسي"، غيِّر
ExtensionsVersionImpl#isAdvancedExtenderImplemented
إلىfalse
.extensions_service
: عيّنة لتنفيذ "خدمة الإضافات" أضِف عملية التنفيذ هنا. تتشابه الواجهة التي سيتم تنفيذها في الخدمة معExtensions-Interface
. على سبيل المثال، يؤدي تنفيذIAdvancedExtenderImpl.Stub
إلى تنفيذ العمليات نفسها التي يؤديهاAdvancedExtenderImpl
. يجب تحديدImageWrapper
وTotalCaptureResultWrapper
لجعلImage
وTotalCaptureResult
قابلَين للتقسيم.
إعداد مكتبة المورّد على جهاز
لا تكون مكتبة المورّد المصنّع الأصلي للجهاز مدمجة في أحد التطبيقات، بل يتم تحميلها من الجهاز
أثناء وقت التشغيل بواسطة Camera2/X. في CameraX، تُعلِن علامة <uses-library>
أنّ مكتبة androidx.camera.extensions.impl
، التي تم تحديدها فيملف
AndroidManifest.xml
لمكتبة camera-extensions
، هي ملحق CameraX ويجب تحميله
أثناء التشغيل. في Camera2، يحمِّل إطار العمل خدمة إضافات <uses-library>
تُعلن أيضًا أنّها تحمِّل مكتبة androidx.camera.extensions.impl
نفسها أثناء التشغيل.
ويسمح هذا للتطبيقات التابعة لجهات خارجية التي تستخدم الإضافات بتحميل مكتبة المصنّع المورّد تلقائيًا. يتم وضع علامة على مكتبة المصنّع الأصلي للجهاز على أنّها اختيارية حتى يمكن تشغيل التطبيقات على الأجهزة التي لا تتضمّن المكتبة. يعالج Camera2/X هذا السلوك تلقائيًا عندما يحاول أحد التطبيقات استخدام ملف برمجي إضافي للكاميرا، ما دامت الشركة المصنّعة للجهاز تضع مكتبة المصنّع الأصلي للجهاز على الجهاز كي يتمكّن التطبيق من اكتشافها.
لإعداد مكتبة المصنّع الأصلي للجهاز على جهاز، اتّبِع الخطوات التالية:
- أضِف ملف أذونات مطلوبًا من علامة
<uses-library>
، باستخدام التنسيق التالي:/etc/permissions/ANY_FILENAME.xml
. على سبيل المثال،/etc/permissions/camera_extensions.xml
. توفّر الملفات في هذا الدليل تعيينًا للمكتبة المُسمّاة في<uses-library>
إلى مسار الملف الفعلي على الجهاز. استخدِم المثال أدناه لإضافة المعلومات المطلوبة إلى الملف.
- يجب أن يكون
name
هوandroidx.camera.extensions.impl
لأنّه هذه هي المكتبة التي تبحث عنها CameraX. file
هو المسار المطلق للملف الذي يحتوي على تنفيذ الإضافات (على سبيل المثال،/system/framework/androidx.camera.extensions.impl.jar
).
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
- يجب أن يكون
في نظام التشغيل Android 12 أو الإصدارات الأحدث، يجب ضبط الموقع ro.camerax.extensions.enabled
على true
على الأجهزة المتوافقة مع CameraX
الإضافات، مما يسمح بطلب ما إذا كان الجهاز متوافقًا مع الإضافات.
لإجراء ذلك، أضِف السطر التالي في ملف الشركة المصنّعة للجهاز:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
التحقُّق
لاختبار عملية تنفيذ مكتبة المورّد المصنّع الأصلي للجهاز أثناء مرحلة تطوير التطبيق، استخدِم نموذج التطبيق المتاح على الرابط التالي:
androidx-main/camera/integration-tests/extensionstestapp/
،
الذي ينفِّذ إضافات مختلفة للمورّدين.
بعد إكمال عملية التنفيذ، استخدِم أداة التحقّق من صحة الإضافات الخاصة بالكاميرا لإجراء اختبارات مبرمَجة واختبارات يدوية للتأكّد من تنفيذ مكتبة المورّد بشكلٍ صحيح.
وضع "مشهد ممتد" مقارنةً بإضافات الكاميرا
بالنسبة إلى تأثير التمويه، بالإضافة إلى إظهاره باستخدام إضافات الكاميرا،
يمكنك إظهاره باستخدام وضع المشهد الموسَّع الذي يتم تفعيله من خلال
مفتاح
CONTROL_EXTENDED_SCENE_MODE
.
لمزيد من تفاصيل التنفيذ، يُرجى الاطّلاع على تأثير "مؤثر بوكيه" في الكاميرا.
يفرض "وضع المشهد الموسّع" قيودًا أقل مقارنةً بإضافات الكاميرا لتطبيقات Camera2. على سبيل المثال، يمكنك تفعيل وضع "المشهد الموسّع" في
مثيل CameraCaptureSession
عادي يتيح تركيبات مجرى البث
المرنة ومَعلمات طلب الالتقاط. في المقابل، لا توفّر إضافات الكاميرات سوى مجموعة ثابتة من أنواع البث، كما أنّها توفّر إمكانية محدودة لاستخدام مَعلمات طلب التقاط المحتوى.
من سلبيات وضع "مشهد ممتد" أنّه لا يمكنك تنفيذه إلا في ملف HAL لكاميرا الهاتف، ما يعني أنّه يجب التحقّق من أنّه يعمل على جميع عناصر التحكّم المتعامدة المتاحة لمطوّري التطبيقات.
ننصحك بعرض تأثير الخلفية الضبابية باستخدام كلّ من وضع المشهد الموسّع و"إضافات Camera " لأنّ التطبيقات قد تفضّل استخدام واجهة برمجة تطبيقات معيّنة لتفعيل تأثير الخلفية الضبابية. ننصحك باستخدام "وضع المشهد الموسّع" أولاً لأنّه يمثّل الطريقة الأكثر مرونة للتطبيقات لتفعيل ميزة "تمويه الخلفية". يمكنك بعد ذلك تنفيذ واجهة إضافات الكاميرا استنادًا إلى وضع المشهد الموسّع. إذا كان تنفيذ ميزة "الخلفية الضبابية" في HAL للكاميرا صعبًا، على سبيل المثال، لأنّها تتطلّب معالجًا لاحقًا يعمل في طبقة التطبيق لمعالجة الصور، ننصحك بتنفيذ إضافة "الخلفية الضبابية" باستخدام واجهة "إضافات الكاميرا".
الأسئلة الشائعة
هل هناك أي قيود على مستويات واجهة برمجة التطبيقات؟
نعم. يعتمد ذلك على مجموعة ميزات واجهة برمجة التطبيقات لنظام التشغيل Android المطلوبة لتنفيذ مكتبة المورّد
المصنع الأصلي للجهاز. على سبيل المثال،
ExtenderStateListener.onPresetSession()
يستخدِم الإجراء
SessionConfiguration.setSessionParameters()
لضبط مجموعة أساسية من العلامات. لا تتوفّر هذه الدعوة إلا في مستوى واجهة برمجة التطبيقات
28 والإصدارات الأحدث. للاطّلاع على تفاصيل حول طُرق واجهة معيّنة، يُرجى الاطّلاع على
مستندات مرجع واجهة برمجة التطبيقات.