على الأجهزة التي تعمل بالإصدار Android 14-QPR1 أو الإصدارات الأحدث، يتيح نظام التشغيل 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 من خلال استدعاء واجهة HAL.
setUsbFunctions
- يُعلم هذا الحقل طبقة تجريد الأجهزة (HAL) الخاصة بأداة USB بضبط برنامج تشغيل أداة UVC باستخدام ConfigFs.
- يُعلم هذا الإجراء طبقة تجريد الأجهزة (HAL) الخاصة بأداة USB باسترداد وظيفة أداة UVC من خلال استدعاء واجهة HAL.
- عند تلقّي ردّ الاتصال من طبقة تجريد الأجهزة (HAL) للأداة، يرسل
system_server
بثًا إلى إطار العمل لكي تستلمه خدمةDeviceAsWebcam
. - يبدأ برنامج تشغيل أداة USB بث كاميرا الويب عند تلقّي أوامر الإعداد من المضيف من خلال عقد V4L2 في
/dev/video*
.
الشكل 2. بنية DeviceAsWebcam
التنفيذ
يوضّح هذا القسم كيفية إتاحة استخدام جهاز Android ككاميرا ويب.
توافق النواة
في نظام التشغيل Android 14 أو الإصدارات الأحدث، تتيح "صورة النواة العامة" (GKI) برنامج تشغيل أداة UVC تلقائيًا (يمكنك الاطّلاع على التفاصيل في تصحيح AOSP).
توفير UVC في Gadget HAL
بدءًا من Android 14، تم تضمين وظيفة UVC في واجهة
GadgetFunction.aidl
HAL. بالنسبة إلى Gadget HAL، يتم تركيب أداة UVC في ConfigFS بالطريقة نفسها التي يتم بها تركيب وظائف ConfigFS الأخرى، مثل MTP أو ADB.
لتنفيذ Gadget HAL، عليك إجراء تعديلات لربط وظيفة UVC بـ ConfigFS. في ما يلي مثال على مقتطف من عملية تنفيذ Gadget 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 في Gadget HAL، باستثناء إنشاء رابط رمزي لوظيفة 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 يبلغ بايتَين لكل بكسل.
- حِزم MJPEG المضغوطة: بافتراض نسبة ضغط تبلغ 1:10 من YUV، يمكن لمنفذ USB 2.0 أن يتيح دقة 4K (1.18 ميغابايت لكل إطار).
- يجب أن تتوافق أجهزة الكاميرا الأمامية والخلفية الأساسية مع جميع أحجام اللقطات التي يتم الإعلان عنها. ويرجع ذلك إلى أنّه يمكن للمستخدم التبديل بين أرقام تعريف الكاميرا باستخدام واجهة مستخدم المعاينة. بالنسبة إلى بث MJPEG، ننصح المورّدين بالإعلان عن أحجام إطارات 480 بكسل (640 × 480) و720 بكسل (1280 × 820) و1080 بكسل (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
خيارًا لتقليل استهلاك الطاقة بشكل أكبر من خلال استخدام عمليات بث فعلية. يمكنك استخدام تراكبات موارد وقت التشغيل (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": {&qu
ot;3" : "UW"}}
إثبات الملكية
لاختبار عملية تنفيذ خدمة DeviceAsWebcam
على جهازك، استخدِم الاختبارات التالية:
- اختبار كاميرا الويب في CTS Verifier: اختبار ما إذا كانت التنسيقات والأحجام ومعدّلات عرض اللقطات متوافقة مع الجهاز
- الاختبارات اليدوية: اختبِر ما إذا كانت ميزة كاميرا الويب تعمل مع مجموعة متنوعة من التطبيقات المضيفة على مجموعة متنوعة من أنظمة التشغيل المضيفة.
المشاكل المعروفة
في ما يلي المشاكل المعروفة في خدمة DeviceAsWebcam
:
في بعض الأحيان، يومض بث برنامج تشغيل أداة UVC ويظهر ما يبدو وكأنّه إطارات تالفة. تم حلّ هذه المشكلة ودمجها في الإصدارات الأحدث وفي GKI.
لا تتوافق أجهزة Android في وضع كاميرا الويب مع كابلات USB 3.0 والإصدارات الأحدث على أجهزة macOS المضيفة بسبب خطأ في برنامج تشغيل UVC من Apple.