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

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل 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:

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