بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 14-QPR1 أو الإصدارات الأحدث، يتيح Android استخدام الجهاز ككاميرا ويب USB. يتم الإعلان عن أجهزة Android التي تدعم هذه الميزة
على أنّها جهاز UVC، يسمح لمجموعة كبيرة من مضيفي USB الذين لديهم أنظمة تشغيل مختلفة (على سبيل المثال، Linux وmacOS وWindows وChromeOS)، باستخدام كاميرا الجهاز ككاميرا ويب. تدعم خدمة DeviceAsWebcam
هذه الميزة لاستخدام الجهاز ككاميرا ويب.
خدمة DeviceAsWebcam
تتضمّن خدمة DeviceAsWebcam
في AOSP نشاط معاينة
(DeviceAsWebcamPreview.java
) يتيح للمستخدمين صياغة المشهد. يتيح نشاط المعاينة
للمستخدم تنفيذ ما يلي:
قم بمعاينة كيفية ظهور خلاصة كاميرا الويب على الجهاز المضيف قبل بدء البث.
يمكنك تخصيص خلاصة كاميرا الويب التي يتم إرسالها إلى المضيف بالطرق التالية:
- جارٍ اختيار الكاميرا للبث، إما من الأمام أو الخلف.
- اختيار مستوى التكبير أو التصغير باستخدام شريط تمرير أو أزرار
- النقر على منطقة معينة من المعاينة للتركيز على منطقة أو إزالة التركيز عليها.
يعمل نشاط المعاينة مع ميزات تسهيل الاستخدام العامة على Android، مثل TalkBack والوصول عبر مفتاح تحكّم وVoice Access.
الشكل 1. بث خلاصة كاميرا الويب إلى أحد المضيفين مع معاينة تتحكّم في الخلاصة.
البنية
يتم توضيح البنية اللازمة لدعم استخدام جهاز ككاميرا ويب في
الشكل 2. وفي ما يلي وصف لمسار تفاعل خدمة DeviceAsWebcam
مع باقي إطار عمل Android:
- ويحدِّد المستخدم خيار كاميرا الويب USB في تطبيق "الإعدادات".
- يرسل تطبيق "الإعدادات" طلب تثبيت إلى
system_server
من خلال فئةUsbManager
لإبلاغه باختيار "FUNCTION_UVC
". - وينفِّذ خادم النظام ما يلي:
- تُعلِم HAL أداة USB باسترداد وظيفة أداة UVC من خلال استدعاء واجهة HAL
setUsbFunctions
. - تُعلمك هذه السياسة بـ HAL لأداة USB لإعداد برنامج تشغيل أداة UVC باستخدام ConfigF.
- تُعلِم HAL أداة USB باسترداد وظيفة أداة UVC من خلال استدعاء واجهة HAL
- عند تلقي معاودة اتصال من HAL للأداة، يرسل
system_server
بثًا إلى إطار العمل لاستلامه من خلال خدمةDeviceAsWebcam
. - يبدأ برنامج تشغيل أداة USB بث كاميرا الويب عند تلقّي أوامر الضبط من المضيف من خلال عُقد V4L2 في
/dev/video*
.
الشكل 2. بنية DeviceAsWebcam.
التنفيذ
يصف هذا القسم كيفية إتاحة استخدام جهاز Android ككاميرا ويب.
دعم Kernel
في نظام التشغيل Android 14 أو الإصدارات الأحدث، تعمل صورة النواة العامة (GKI) على برنامج تشغيل أدوات UVC تلقائيًا (يمكنك الاطّلاع على التفاصيل في تصحيح AOSP).
دعم UVC في HAL للأداة
بدءًا من الإصدار 14 من نظام Android، يتم تضمين وظيفة UVC في واجهة HAL
GadgetFunction.aidl
. بالنسبة إلى 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
، فلا يلزم في جاد HAL أي منطق خاص بـ UVC - بخلاف ربط دالة UVC بـ ConfigFS.
لمزيد من الإرشادات حول التنفيذ، يمكن الاطّلاع على الرمز النموذجي التالي في 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 يبلغ 2 بايت لكل بكسل.
- مجموعات بث MJPEG المضغوطة: بافتراض نسبة الضغط 1:10 من YUV، يمكن أن يتوافق USB 2.0 مع 4K (1.18 ميغابايت لكل إطار).
- يجب أن تتوافق أجهزة الكاميرا الأمامية والخلفية الرئيسية مع جميع أحجام الإطارات التي يتم الإعلان عنها. وذلك لأنه يمكن للمستخدم التبديل بين معرّفات الكاميرات باستخدام واجهة مستخدم المعاينة. بالنسبة إلى مجموعات بث MJPEG، ننصح الموردين بالإعلان عن أحجام إطارات بدقة 480p (640 × 480) و720p (1280 × 820) و1080p (1920 × 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
خيار تقليل استهلاك الطاقة باستخدام مجموعات بث مادية. يمكنك استخدام تراكبات موارد وقت التشغيل (RROs) لتحديد الكاميرا الفعلية التي تريد استخدامها. تؤدي مجموعات البث المادية إلى خفض جودة الفيديو بشكل كبير وتؤدي إلى تجربة مستخدم مُحيرة، لذلك ننصحك باستخدام هذا الحلّ كحلّ أخير. إنّ تحسين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.