بالنسبة إلى الأجهزة التي تعمل بالإصدار 14-QPR1 من Android أو إصدار أحدث، يتيح Android استخدام
الجهاز ككاميرا ويب USB. يتم الإعلان عن أجهزة Android التي تدعم هذه الميزة
على أنّها جهاز UVC، يسمح لمجموعة كبيرة من مضيفي USB الذين لديهم أنظمة تشغيل مختلفة (على سبيل المثال، Linux وmacOS وWindows وChromeOS)، باستخدام كاميرا الجهاز ككاميرا ويب. تتيح خدمة DeviceAsWebcam
استخدام هذه الميزة لاستخدام الجهاز ككاميرا ويب.
خدمة DeviceAsWebcam
تتضمّن خدمة DeviceAsWebcam
في AOSP نشاط معاينة
(DeviceAsWebcamPreview.java
) يتيح للمستخدمين وضع إطار للمشهد. يتيح نشاط المعاينة
للمستخدم تنفيذ ما يلي:
يمكنك معاينة الشكل الذي ستظهر به خلاصة كاميرا الويب على الجهاز المضيف قبل بدء البث.
يمكنك تخصيص خلاصة كاميرا الويب المُرسَلة إلى المضيف بالطُرق التالية:
- اختيار الكاميرا التي تريد البث من خلالها، سواء كانت الأمامية أو الخلفية
- اختيار مستوى التكبير/التصغير باستخدام شريط تمرير أو أزرار
- النقر على منطقة معيّنة من المعاينة للتركيز عليها أو إزالة التركيز على منطقة
يعمل نشاط المعاينة مع ميزات تسهيل الاستخدام العامة على Android، مثل TalkBack والوصول عبر مفتاح التحويل و الاستخدام عبر الصوت.
الشكل 1: يتم بث خلاصة كاميرا الويب إلى مضيف مع معاينة تتحكّم في الخلاصة.
هندسة معمارية
توضِّح المخطّط التالي البنية الأساسية لاستخدام جهاز ككاميرا ويب:
الشكل 2. وفي ما يلي وصف لمسار تفاعل خدمة DeviceAsWebcam
مع باقي إطار عمل Android:
- ويحدِّد المستخدم خيار كاميرا الويب USB في تطبيق "الإعدادات".
- يُرسِل تطبيق "الإعدادات" طلب ربط إلى
system_server
من خلال فئةUsbManager
لإعلامها بأنّه تم اختيارFUNCTION_UVC
. - وينفِّذ خادم النظام ما يلي:
- إبلاغ HAL لأجهزة USB لاسترداد وظيفة جهاز UVC من خلال واجهة
setUsbFunctions
HAL - إبلاغ HAL لأجهزة USB بضبط برنامج تشغيل جهاز UVC باستخدام ConfigFs
- إبلاغ HAL لأجهزة USB لاسترداد وظيفة جهاز UVC من خلال واجهة
- عند تلقّي مكالمة صادرة من HAL للأجهزة، يُرسِل
system_server
بثًا إلى إطار العمل ليتم استرجاعه من خلال خدمةDeviceAsWebcam
. - يشغِّل برنامج تشغيل جهاز USB بث كاميرا الويب عند تلقّي رسائل برمجية لضبط الإعدادات من المضيف من خلال عقد V4L2 في
/dev/video*
.
الشكل 2. بنية DeviceAsWebcam
التنفيذ
يوضِّح هذا القسم كيفية إتاحة استخدام جهاز Android ككاميرا ويب.
دعم النواة
في نظام التشغيل Android 14 أو الإصدارات الأحدث، تعمل صورة النواة العامة (GKI) على برنامج تشغيل أدوات UVC تلقائيًا (يمكنك الاطّلاع على التفاصيل في تصحيح AOSP).
دعم UVC في HAL للأداة
بدءًا من الإصدار Android 14، تم تضمين وظيفة UVC في واجهة
GadgetFunction.aidl
HAL. بالنسبة إلى Widget HAL، يتم تثبيت أداة UVC على ConfigFS بالطريقة نفسها التي يتم بها تثبيت دوال ConfigFS الأخرى مثل MTP أو ADB.
لتنفيذ HAL الخاص بالأجهزة، عليك إجراء تعديلات لتركيب وظيفة UVC في ملف ConfigFS. في ما يلي مثال على مقتطف لواجهة HAL لجهاز مدعوم باستخدام وظيفة UVC:
UsbGadget::setCurrentUsbFunctions(long functions) {
...
// Existing functions
if ((functions & GadgetFunction::MTP) != 0) {
...
linkFunction("ffs.mtp"); // Mount to ConfigFS
...
}
...
// UVC function follows the same pattern!
if ((functions & GadgetFunction::UVC) != 0) {
...
linkFunction("uvc.0"); // Mount to ConfigFS
...
}
...
}
عندما يعمل الجهاز ككاميرا ويب، تأكَّد من أنّ HAL لجهاز USB يعرض مجموعات VID/PID المناسبة.
ولأنّ كل منطق UVC يكون إما في تهيئة المورِّد أو في خدمة DeviceAsWebcam
،
فليس هناك أي منطق خاص بـ UVC غير ربط دالة UVC بـ ConfigFS
في جاد HAL.
للحصول على مزيد من الإرشادات حول التنفيذ، اطّلِع على الرمز البرمجي النموذجي التالي في AOSP:
إعداد ConfigFS باستخدام إعدادات UVC
لإعلام برنامج تشغيل أداة UVC بالتنسيقات والأحجام ومعدّلات عرض اللقطات التي تتوافق مع كاميرا الويب في Android، عليك إعداد ConfigFS باستخدام إعدادات UVC. للحصول على مزيد من المعلومات، يُرجى الاطّلاع على مستندات Linux الأساسية حول ABI لجهاز ConfigFS UVC القابل للبرمجة.
في ما يلي مثال على كيفية إعداد المورِّد لبرنامج تشغيل أداة UVC (مقتطف الرمز في AOSP):
# uvc function
mkdir /configfs_path/functions/uvc.0
write /configfs_path/functions/uvc.0/function_name "Android Webcam"
write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
# setup control params
mkdir /configfs_path/functions/uvc.0/control/header/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/fs/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/ss/h
# advertise 1080p resolution for webcam encoded as mjpeg
mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
# advertise 30 fps support for 1080p.
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
# setup streaming params
mkdir /configfs_path/functions/uvc.0/streaming/header/h
symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
/configfs_path/functions/uvc.0/streaming/header/h/m
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/fs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/hs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
# ...
يُعدّ هذا المقتطف برنامج تشغيل لأداة UVC لعرض بث MJPEG بدقة 1080p بمعدّل 30 صورة في الثانية. ويتم إرسال هذه الإمكانات إلى مضيف USB عندما يطلب معرفة الدقة وعدد اللقطات في الثانية المتوافقَين.
وفي ما يلي إرشادات عامة لاختيار الإعدادات التي تعلنها كاميرا الويب:
- تنسيقَا البث المتوافقَين مع خدمة
DeviceAsWebcam
هما MJPEG و YUYV غير المضغوطة. - يدعم USB 2.0 نقل البيانات بسرعة 480 ميغابت في الثانية (60 ميغابايت في الثانية). وهذا يعني أنّه عند عرض 30 لقطة في الثانية، يجب ألا يزيد حجم كل لقطة عن 2 ميغابايت،
وإذا كان عدد اللقطات في الثانية 60 لقطة، يجب ألا يزيد حجم كل لقطة عن 1 ميغابايت.
- أحداث البث غير المضغوطة (YUYV): عند 30 صورة في الثانية، يكون الحد الأقصى لحجم اللقطة المتوافق هو 720p لأنّ تنسيق YUYV يضم بايتين لكل بكسل.
- أحداث MJPEG المضغوطة: بافتراض نسبة ضغط 1:10 من YUV، يمكن لبروتوكول USB 2.0 إتاحة دقة 4K (1.18 MB لكل إطار).
- يجب أن تتوافق أجهزة الكاميرا الأمامية والخلفية الرئيسية مع جميع أحجام الإطارات التي يتم الإعلان عنها. ويرجع ذلك إلى أنّه يمكن للمستخدم التبديل بين أرقام تعريف الكاميرات باستخدام واجهة مستخدم المعاينة. بالنسبة إلى أحداث البث بتنسيق MJPEG، ننصح المورّدين بعرض أحجام اللقطات بدقة 480p (640 x 480) و720p (1280 x 820) و1080p (1920 x 1080) لأنّها الأحجام التي تستخدمها التطبيقات المستضيفة بشكل شائع.
- يجب أن تدعم أجهزة الكاميرا الأمامية والخلفية جميع معدلات عرض الإطارات المُعلَن عنها. ننصحك بشدة بأن يتيح المورّدون سرعة 30 صورة في الثانية.
للحصول على مثال على إضافة إعدادات بث كاميرا الويب (ConfigFS)، يُرجى الاطّلاع على نموذج تصحيح AOSP.
تفعيل كاميرا الويب في الإصدار
لتفعيل خدمة DeviceAsWebcam
، يجب ضبط ro.usb.uvc.enabled
سمة النظام على true
في ملف device.mk
.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
عند تفعيل خاصية النظام هذه، يظهر خيار كاميرا الويب في تطبيق "الإعدادات" ضمن إعدادات USB المفضّلة كما هو موضّح في الشكل 3. عند تحديد الخيار، يظهر جهاز Android للجهاز المضيف ككاميرا ويب USB.
الشكل 3: الإعدادات المفضّلة لـ USB في تطبيق "الإعدادات"
يمكنك أيضًا ضبط الجهاز على وظيفة كاميرا الويب USB من خلال ADB باستخدام الأمر التالي:
adb shell svc usb setFunctions uvc
مراعاة المخاوف المتعلقة بالطاقة والحرارة
تشير عمليات كاميرا الويب إلى أنّ كاميرا الجهاز قد تظل قيد التشغيل لعدة ساعات في اليوم، لذا ننصح باتّخاذ بعض التدابير لضمان عدم تجاوز حدود استهلاك الطاقة والحرارة للجهاز. في ما يلي حلول مُقترَحة للحفاظ على استهلاك الطاقة أقل من الحدود المسموح بها:
- للحصول على أداء أفضل للطاقة من طبقة تجريد الأجهزة (HAL) للكاميرا، يمكنك تفعيل
STREAM_USE_CASE_VIDEO_CALL
في خدمةDeviceAsWebcam
. إذا كان مصدر الطاقة مصدر قلق حتى مع تفعيل
STREAM_USE_CASE_VIDEO_CALL
، تقدّم خدمةDeviceAsWebcam
خيارًا لتقليل استهلاك الطاقة بشكل أكبر من خلال البث المباشر. يمكنك استخدام تراكبات موارد وقت التشغيل (RRO) لتحديد الكاميرا الفعلية التي تريد استخدامها. تؤدي عمليات البث المباشر غير المتصل بالإنترنت إلى خفض جودة الفيديو بشكل كبير وتؤدي إلى تجربة مستخدم مربكة، لذا لا تستخدِم هذا الحلّ إلا كحلّ أخير. إنّ تحسينSTREAM_USE_CASE_VIDEO_CALL
هو الحلّ المفضّل لحلّ مشكلات الطاقة. لمزيد من المعلومات عن عمليات إعادة التوجيه (RRO) المتوافقة معDeviceAsWebcam
الخدمة، يُرجى الاطّلاع على readme.md.في ما يلي مثال على إعداد RRO لاستخدام معرّف الكاميرا الفعلي 3 بدلاً من معرّف الكاميرا المنطقي 0. للحصول على مثال في AOSP، يُرجى الاطّلاع على DeviceAsWebcamRaven.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
التحقق
لاختبار عملية تنفيذ خدمة DeviceAsWebcam
على جهازك، استخدِم
الاختبارات التالية:
- اختبار أداة التحقّق من توافق الأجهزة مع معيار CTS لـ الكاميرا المزوّدة بويب: عليك اختبار تنسيقات الملفات وأحجامها ومعدلات عرض اللقطات للتأكّد من توافقها مع الجهاز.
- الاختبارات اليدوية: يمكنك اختبار عمل ميزة كاميرا الويب مع مجموعة متنوعة من التطبيقات المستضافة على مجموعة متنوعة من أنظمة التشغيل المستضافة.
المشاكل المعروفة
في ما يلي المشاكل المعروفة في خدمة DeviceAsWebcam
:
في بعض الأحيان، ينطفئ بث برنامج تشغيل أداة UVC ويظهر فيه ما يبدو أنّه لقطات متضرّرة. تم إصلاح هذه المشكلة ودمجها ضمن مرحلة البث المباشر وفي GKI.
لا تعمل أجهزة Android في وضع كاميرا الويب مع كابلات USB 3.0 والإصدارات الأحدث على مضيفي macOS بسبب خطأ في برنامج تشغيل UVC من Apple.