از یک دستگاه به عنوان وب کم استفاده کنید

برای دستگاه‌های دارای Android 14-QPR1 یا بالاتر، Android از استفاده از دستگاه به‌عنوان وب‌کم USB پشتیبانی می‌کند. دستگاه‌های اندرویدی که از این ویژگی پشتیبانی می‌کنند به عنوان یک دستگاه UVC تبلیغ می‌شوند که به طیف گسترده‌ای از میزبان‌های USB با سیستم‌عامل‌های مختلف (به عنوان مثال، لینوکس، macOS، Windows و ChromeOS) اجازه می‌دهد از دوربین دستگاه به‌عنوان وب‌کم استفاده کنند. سرویس DeviceAsWebcam از این ویژگی برای استفاده از دستگاه به عنوان وب کم پشتیبانی می کند.

سرویس DeviceAsWebcam

سرویس DeviceAsWebcam در AOSP شامل یک فعالیت پیش نمایش ( DeviceAsWebcamPreview.java ) است که به کاربران اجازه می دهد صحنه را قاب بندی کنند. فعالیت پیش نمایش به کاربر اجازه می دهد کارهای زیر را انجام دهد:

  • پیش‌نمایش نحوه نمایش فید وب‌کم در دستگاه میزبان را قبل از شروع پخش کنید.

  • فید وب کم ارسال شده به میزبان را به روش های زیر سفارشی کنید:

    • انتخاب دوربین برای پخش جریانی، جلو یا عقب.
    • انتخاب سطح زوم با استفاده از یک نوار لغزنده یا دکمه.
    • برای فوکوس کردن یا حذف فوکوس روی یک منطقه، روی ناحیه خاصی از پیش‌نمایش ضربه بزنید.

فعالیت پیش‌نمایش با ویژگی‌های دسترسی عمومی در Android مانند TalkBack ، Switch Access و Voice Access کار می‌کند.

فید وب کم به میزبان پخش شد

شکل 1. فید وب کم در حال پخش جریانی به یک میزبان با پیش نمایش کنترل فید.

معماری

معماری برای پشتیبانی از استفاده از یک دستگاه به عنوان وب کم در شکل 2 نشان داده شده است. در زیر جریان تعامل سرویس DeviceAsWebcam با بقیه چارچوب اندروید توضیح داده شده است:

  1. کاربر گزینه وب کم USB را در برنامه تنظیمات انتخاب می کند.
  2. برنامه تنظیمات از طریق کلاس UsbManager یک تماس بایندر به system_server ارسال می کند و به آن اطلاع می دهد که FUNCTION_UVC انتخاب شده است.
  3. سرور سیستم کارهای زیر را انجام می دهد:
    1. به ابزار USB HAL اطلاع می دهد تا عملکرد ابزار UVC را از طریق یک تماس رابط setUsbFunctions HAL بازیابی کند.
    2. به ابزار USB HAL اطلاع می دهد تا درایور ابزار UVC را با استفاده از ConfigFs پیکربندی کند.
  4. پس از دریافت یک تماس از ابزار HAL، system_server یک پخش را به فریمورک ارسال می کند تا توسط سرویس DeviceAsWebcam دریافت شود.
  5. درایور ابزار USB جریان وب کم را با دریافت دستورات پیکربندی از میزبان از طریق گره های V4L2 در /dev/video* شروع می کند.

دستگاه به عنوان معماری وب کم

شکل 2. معماری DeviceAsWebcam.

پیاده سازی

در این بخش نحوه پشتیبانی از استفاده از دستگاه اندروید به عنوان وب کم توضیح داده شده است.

پشتیبانی از کرنل

برای Android 14 یا بالاتر، Generic Kernel Image (GKI) به طور پیش‌فرض درایور ابزار UVC را فعال می‌کند (جزئیات را در پچ AOSP ببینید).

پشتیبانی از UVC در گجت HAL

با شروع Android 14، عملکرد UVC در رابط HAL GadgetFunction.aidl گنجانده شده است. برای گجت HAL، ابزار UVC همانند سایر عملکردهای ConfigFS مانند MTP یا ADB روی ConfigFS نصب می شود.

برای پیاده سازی Gadget 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
       ...
   }
   ...
}

هنگامی که دستگاه به عنوان یک وب کم عمل می کند، مطمئن شوید که ابزار USB HAL ترکیب های مناسب VID/PID را تبلیغ می کند.

از آنجایی که تمام منطق UVC در Init فروشنده یا در سرویس DeviceAsWebcam است، هیچ منطق خاص UVC، به جز پیوند نمادین تابع UVC به ConfigFS، در Gadget HAL مورد نیاز نیست.

برای راهنمایی بیشتر در مورد پیاده سازی، کد نمونه زیر را در AOSP ببینید:

ConfigFS را با تنظیمات UVC تنظیم کنید

برای اطلاع دادن به درایور ابزار UVC که کدام قالب‌ها، اندازه‌ها و نرخ فریم توسط وب‌کم Android پشتیبانی می‌شوند، ConfigFS را با پیکربندی‌های UVC راه‌اندازی کنید. برای اطلاعات بیشتر، به اسناد بالادستی لینوکس در ابزار ConfigFS UVC ABI مراجعه کنید.

در زیر نمونه‌ای از نحوه راه‌اندازی درایور ابزار UVC ( قطعه کد در AOSP ) توسط init توسط فروشنده ارائه شده است:

# 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 x 480)، 720p (1280 x 820) و 1080p (1920 x 1080) را تبلیغ کنند زیرا این اندازه‌ها معمولاً توسط برنامه‌های میزبان استفاده می‌شوند.
  • دستگاه‌های دوربین اصلی جلو و عقب باید از همه نرخ‌های فریمی که تبلیغ می‌شوند پشتیبانی کنند. ما قویاً به فروشندگان توصیه می کنیم از 30 فریم در ثانیه پشتیبانی کنند.

برای مثالی از افزودن پیکربندی‌های جریان وب‌کم (ConfigFS)، وصله نمونه AOSP را ببینید.

فعال کردن وب کم در ساخت

برای فعال کردن سرویس DeviceAsWebcam ، باید ویژگی ro.usb.uvc.enabled system را در فایل device.mk روی true تنظیم کنید.

# 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) برای تعیین اینکه از کدام دوربین فیزیکی استفاده کنید استفاده کنید. جریان های فیزیکی به طور قابل توجهی کیفیت ویدیو را کاهش می دهد و منجر به UX گیج کننده می شود، بنابراین از این راه حل فقط به عنوان آخرین راه حل استفاده کنید. بهینه سازی 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 شناخته شده است: