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

بالنسبة إلى الأجهزة التي تعمل بالإصدار 14-QPR1 من Android أو إصدار أحدث، يتيح 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 من خلال واجهة setUsbFunctions HAL
    2. إبلاغ HAL لأجهزة USB بضبط برنامج تشغيل جهاز UVC باستخدام ConfigFs
  4. عند تلقّي مكالمة صادرة من HAL للأجهزة، يُرسِل system_server بثًا إلى إطار العمل ليتم استرجاعه من خلال خدمة DeviceAsWebcam.
  5. يشغِّل برنامج تشغيل جهاز 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: