تم الترخيص بموجب ترخيص Apache، الإصدار 2.0 (المشار إليه لاحقًا باسم "الترخيص")؛ ولا يحق لك استخدام هذا الملف إلا بما يتوافق مع الترخيص. ويمكنك الحصول على نسخة من الترخيص على الصفحة
http://www.apache.org/licenses/LICENSE-2.0
ما لم يكن مطلوبًا بموجب القانون الساري أو تمت الموافقة عليه كتابةً، يتم توزيع البرنامج الذي يتم توزيعه بموجب الترخيص "كما هو"، وبدون أية ضمانات أو شروط من أي نوع، سواء كانت صريحة أو ضمنية. راجِع الترخيص للاطّلاع على اللغة المحددة التي تحكم الأذونات والقيود بموجب الترخيص. -->
يدعم نظام Android الأساسي استخدام كاميرات USB التي تعمل بميزة التوصيل والتشغيل (أي كاميرات الويب) باستخدام واجهة برمجة التطبيقات Android Camera2 API العادية وواجهة طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا. تتوافق كاميرات الويب بشكل عام مع برامج تشغيل بث الفيديو عبر USB (UVC)، وفي نظام التشغيل Linux، يتم استخدام برنامج التشغيل العادي Video4Linux (V4L) للتحكّم في كاميرات UVC.
من خلال توفير إمكانية استخدام كاميرات الويب، يمكن استخدام الأجهزة في حالات استخدام بسيطة، مثل محادثات الفيديو وأكشاك الصور. لا تحلّ هذه الميزة محلّ برامج HAL النموذجية الداخلية للكاميرا على هواتف Android، كما أنّها غير مصمَّمة لتوفير الدعم للمهام المعقّدة التي تتطلّب أداءً عاليًا، مثل البث عالي الدقة وعالي السرعة، والواقع المعزّز، والتحكّم اليدوي في معالج إشارات الصور (ISP) والمستشعر والعدسة.
تمثّل عملية HAL الخاصة بكاميرا USB جزءًا من موفّر الكاميرا الخارجية الذي يستمع إلى مدى توفّر أجهزة USB ويحصي أجهزة الكاميرا الخارجية وفقًا لذلك. تتضمّن العملية أذونات وسياسة أمان SE مشابهة لعملية HAL المدمجة الخاصة بالكاميرا. تتطلّب تطبيقات كاميرا الويب التابعة لجهات خارجية التي تتواصل مباشرةً مع أجهزة USB أذونات الكاميرا نفسها للوصول إلى أجهزة UVC كما هو الحال مع أي تطبيق كاميرا عادي.
أمثلة ومصادر
لمزيد من المعلومات حول كيفية استخدام كاميرات USB، يُرجى الاطّلاع على التنفيذ المرجعي لموفّر الكاميرا الخارجية على ExternalCameraProvider.
يتم تضمين عمليات تنفيذ جهاز الكاميرا الخارجية والجلسة في
ExternalCameraDevice
و
ExternalCameraDeviceSession.
بدءًا من المستوى 28 لواجهة برمجة التطبيقات، تتضمّن واجهة برمجة التطبيقات لبرنامج Java
EXTERNAL
مستوى الأمان على الأجهزة.
التنفيذ
يجب أن يتيح التنفيذ استخدام ميزة
android.hardware.usb.host
في النظام.
يجب أيضًا تفعيل دعم النواة لأجهزة UVC. يمكنك تفعيل ذلك من خلال إضافة ما يلي إلى ملفات defconfig الخاصة بنواة النظام.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
لتفعيل موفّر الكاميرا الخارجية في إصدار الجهاز المعنيّ، والذي يضيف أذونات SELinux اللازمة وإعدادات الكاميرا الخارجية وتبعيات موفّر الكاميرا الخارجية، عليك إكمال الخطوات التالية:
أضِف ملف إعدادات الكاميرا الخارجية ومكتبة الكاميرا الخارجية إلى
device.mk.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xmlأضِف اسم موفِّر الكاميرا الخارجية إلى بيان Treble HAL الخاص بالجهاز.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>(اختياري) إذا كان الجهاز يعمل في وضع Treble passthrough، عدِّل
sepolicyحتى يتمكّنcameraserverمن الوصول إلى كاميرا UVC.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
في ما يلي مثال على external_camera_config.xml (تم حذف أسطر حقوق الطبع والنشر).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
التخصيص
يمكنك تحسين أداء كاميرا Android من خلال خيارات التخصيص العامة أو عمليات التحسين الخاصة بالجهاز.
عمليات التخصيص العامة
يمكنك تخصيص موفّر الكاميرا الخارجية من خلال تعديل ملف
external_camera_config.xml. على وجه التحديد، يمكن للعملاء تخصيص المَعلمات التالية:
- استبعاد عُقد الفيديو الخاصة بالكاميرات الداخلية
- الحدّ الأعلى المسموح به لحجم الصورة وعدد اللقطات في الثانية
- عدد المخازن المؤقتة أثناء الرحلة (المفاضلة بين التشويش والذاكرة)
بالإضافة إلى هذه المَعلمات، يمكنك إضافة مَعلماتك الخاصة أو تطوير إعداداتك الخاصة.
تحسينات خاصة بالجهاز
يمكنك أيضًا تحسين الأداء من خلال إضافة تحسينات خاصة بالجهاز.
نسخ/تغيير حجم المخزن المؤقت وفك/تشفير JPEG
تستخدم عمليات التنفيذ العامة وحدة المعالجة المركزية (libyuv/libjpeg)، ولكن يمكنك استبدالها بعمليات تحسين خاصة بالجهاز.
تنسيق إخراج HAL
تستخدم عمليات التنفيذ العامة تنسيقات الإخراج التالية:
YUV_420_888لمخازن الفيديو المؤقتةIMPLEMENTATION_DEFINEDYUV12لجميع مخازنIMPLEMENTATION_DEFINEDالمؤقتة الأخرى
لتحسين الأداء، يمكنك استبدال تنسيقات الإخراج بتنسيقات فعّالة خاصة بالجهاز. يمكنك أيضًا توفير تنسيقات إضافية في عملية تنفيذ مخصّصة.
التحقق من صحة البيانات
يجب أن تجتاز الأجهزة المتوافقة مع الكاميرات الخارجية اختبار التوافق مع نظام التشغيل CTS للكاميرا. يجب أن يظل جهاز USB الخارجي متصلاً بالجهاز المحدّد طوال مدة الاختبار، وإلا ستتعذّر بعض حالات الاختبار.