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

بالنسبة إلى الأجهزة التي تعمل بالإصدار 14-QPR1 من نظام التشغيل Android أو الإصدارات الأحدث، يتيح نظام التشغيل 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 في GadgetFunction.aidl واجهة HAL. بالنسبة إلى جادات HAL، فإن UVC يتم تثبيت الأداة على ConfigFS بالطريقة نفسها التي يتم بها تحميل دوال ConfigFS الأخرى مثل MTP أو ADB.

لتنفيذ Widget 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 الأولية في ConfigFS UVC واجهة التطبيق الثنائية (ABI).

فيما يلي مثال على كيفية قيام البائع بإعداد برنامج تشغيل أداة 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 و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 × 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 خيارًا لخفض مستوى الطاقة بشكل أكبر. باستخدام تيارات مادية. يمكنك استخدام تراكبات موارد وقت التشغيل (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: