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

بالنسبة إلى الأجهزة التي تعمل بالإصدار 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. يُعلم خادم USB gadget HAL باسترداد وظيفة UVC gadget من خلال طلب واجهة HAL‏ setUsbFunctions.
    2. يُعلم خادم USB gadget HAL بضبط برنامج تشغيل UVC gadget باستخدام ConfigFs.
  4. عند تلقّي ردّ من خادم gadget HAL، يرسل system_server بثًا إلى إطار العمل لكي تتلقّاه خدمة DeviceAsWebcam.
  5. يبدأ برنامج تشغيل USB gadget بث كاميرا الويب عند تلقّي أوامر الإعداد من الجهاز المضيف من خلال عُقد V4L2 في /dev/video*.

بنية وظيفة "استخدام الجهاز ككاميرا ويب"

الشكل 2: الهندسة المعمارية لخدمة DeviceAsWebcam

التنفيذ

يوضّح هذا القسم كيفية إتاحة استخدام جهاز Android ككاميرا ويب.

دعم النواة

بالنسبة إلى الإصدار Android 14 أو الإصدارات الأحدث، تفعِّل صورة النواة العامة (GKI) برنامج تشغيل UVC gadget driver تلقائيًا (اطّلِع على التفاصيل في AOSP patch).

توفير دعم UVC في خادم Gadget HAL

بدءًا من الإصدار Android 14، يتم تضمين وظيفة UVC في الـ GadgetFunction.aidl HAL. بالنسبة إلى خادم Gadget HAL، يتم تثبيت UVC gadget على 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
       ...
   }
   ...
}

عندما يعمل الجهاز ككاميرا ويب، تأكّد من أنّ خادم USB gadget HAL يعلن عن مجموعات VID/PID المناسبة.

بما أنّ جميع منطق UVC موجود إما في vendor init أو في خدمة DeviceAsWebcam، لا يلزم توفير أي منطق خاص بـ UVC في خادم Gadget HAL، باستثناء إنشاء رابط رمزي لوظيفة UVC إلى ConfigFS.

لمزيد من الإرشادات حول التنفيذ، اطّلِع على نموذج الرمز التالي في AOSP:

إعداد ConfigFS باستخدام إعدادات UVC

لإعلام برنامج تشغيل UVC gadget بالتنسيقات والأحجام ومعدّلات الإطارات التي تتيحها كاميرا ويب Android، عليك إعداد ConfigFS باستخدام إعدادات UVC. لمزيد من المعلومات، اطّلِع على مستندات Linux الأحدث حول واجهة التطبيق الثنائية (ABI) لـ ConfigFS UVC gadget.

في ما يلي مثال على كيفية إعداد vendor init لبرنامج تشغيل UVC gadget (مقتطف الرمز في 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 gadget للإعلان عن بث 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، ننصح المورّدين بالإعلان عن أحجام الإطارات 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 للجهاز المضيف.

إعدادات 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 هو الحل المفضّل للمشاكل المتعلّقة بالطاقة. لمزيد من المعلومات حول عمليات تراكب الموارد في وقت التشغيل التي تتيحها خدمة DeviceAsWebcam ، اطّلِع على ملف readme.md.

    في ما يلي مثال على إعداد عملية تراكب الموارد في وقت التشغيل لاستخدام رقم تعريف الكاميرا الفعلية 3 بدلاً من رقم تعريف الكاميرا المنطقية 0. للاطّلاع على مثال في AOSP، يمكنك الاطّلاع على DeviceAsWebcamRaven.

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

إثبات الملكية

لاختبار تنفيذ خدمة DeviceAsWebcam على جهازك، استخدِم الاختبارات التالية:

  • اختبار كاميرا الويب في أداة التحقق من التوافق مع مجموعة اختبارات التوافق (CTS): اختبِر ما إذا كان الجهاز يتيح التنسيقات والأحجام ومعدّلات الإطارات.
  • الاختبارات اليدوية: اختبِر ما إذا كانت ميزة كاميرا الويب تعمل مع مجموعة متنوعة من التطبيقات المضيفة على مجموعة متنوعة من أنظمة التشغيل المضيفة.

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

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