استخدام جهاز ككاميرا ويب

على الأجهزة التي تعمل بالإصدار Android 14-QPR1 أو الإصدارات الأحدث، يتيح نظام التشغيل Android استخدام الجهاز ككاميرا ويب USB. تُعلن أجهزة Android المتوافقة مع هذه الميزة عن نفسها كجهاز UVC، ما يتيح لمجموعة كبيرة من مضيفي USB الذين يعملون بأنظمة تشغيل مختلفة (مثل Linux وmacOS وWindows وChromeOS) استخدام كاميرا الجهاز ككاميرا ويب. تتيح خدمة DeviceAsWebcam استخدام الجهاز ككاميرا ويب.

خدمة DeviceAsWebcam

تتضمّن خدمة DeviceAsWebcam في AOSP نشاط معاينة (DeviceAsWebcamPreview.java) يتيح للمستخدمين تأطير المشهد. يتيح نشاط المعاينة للمستخدم إجراء ما يلي:

  • معاينة شكل خلاصة كاميرا الويب على الجهاز المضيف قبل بدء البث

  • يمكنك تخصيص خلاصة كاميرا الويب المُرسَلة إلى المضيف بالطرق التالية:

    • اختيار الكاميرا التي تريد البث منها، سواء كانت أمامية أو خلفية
    • اختيار مستوى التكبير أو التصغير باستخدام شريط تمرير أو أزرار
    • النقر على منطقة معيّنة من المعاينة للتركيز على منطقة أو إزالة التركيز عنها

تعمل ميزة "المعاينة" مع ميزات تسهيل الاستخدام العامة على Android، مثل TalkBack والوصول عبر مفتاح تحكّم والاستخدام عبر الصوت.

خلاصة كاميرا الويب التي يتم بثها إلى المضيف

الشكل 1. يتم بث صورة من كاميرا الويب إلى مضيف مع معاينة تتحكّم في الصورة.

البنية

يوضّح الشكل 2 بنية النظام اللازمة لاستخدام جهاز ككاميرا ويب. يوضّح ما يلي مسار التفاعل بين DeviceAsWebcam الخدمة وبقية إطار عمل Android:

  1. يختار المستخدم خيار كاميرا الويب USB في تطبيق "الإعدادات".
  2. يرسل تطبيق "الإعدادات" طلب ربط إلى system_server من خلال الفئة UsbManager لإبلاغه بأنّه تم اختيار FUNCTION_UVC.
  3. ينفِّذ خادم النظام ما يلي:
    1. يُعلم هذا الإجراء طبقة تجريد الأجهزة (HAL) الخاصة بأداة USB باسترداد وظيفة أداة UVC من خلال استدعاء واجهة HAL.setUsbFunctions
    2. يُعلم هذا الحقل طبقة تجريد الأجهزة (HAL) الخاصة بأداة USB بضبط برنامج تشغيل أداة UVC باستخدام ConfigFs.
  4. عند تلقّي ردّ الاتصال من طبقة تجريد الأجهزة (HAL) للأداة، يرسل system_server بثًا إلى إطار العمل لكي تستلمه خدمة DeviceAsWebcam.
  5. يبدأ برنامج تشغيل أداة 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 على الجهاز المضيف.

إعدادات 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 Verifier: اختبار ما إذا كانت التنسيقات والأحجام ومعدّلات عرض اللقطات متوافقة مع الجهاز
  • الاختبارات اليدوية: اختبِر ما إذا كانت ميزة كاميرا الويب تعمل مع مجموعة متنوعة من التطبيقات المضيفة على مجموعة متنوعة من أنظمة التشغيل المضيفة.

المشاكل المعروفة

في ما يلي المشاكل المعروفة في خدمة DeviceAsWebcam: