برای دستگاههایی که اندروید ۱۴ QPR1 یا بالاتر را اجرا میکنند، اندروید از استفاده از دستگاه به عنوان وبکم USB پشتیبانی میکند. دستگاههای اندرویدی که از این ویژگی پشتیبانی میکنند، به عنوان دستگاه UVC تبلیغ میشوند که به طیف گستردهای از میزبانهای USB با سیستم عاملهای مختلف (به عنوان مثال، لینوکس، macOS، ویندوز و ChromeOS) اجازه میدهد از دوربین دستگاه به عنوان وبکم استفاده کنند. سرویس DeviceAsWebcam از این ویژگی برای استفاده از دستگاه به عنوان وبکم پشتیبانی میکند.
سرویس DeviceAsWebcam
سرویس DeviceAsWebcam در AOSP شامل یک فعالیت پیشنمایش ( DeviceAsWebcamPreview.java ) است که به کاربران اجازه میدهد صحنه را قاببندی کنند. فعالیت پیشنمایش به کاربر امکان میدهد موارد زیر را انجام دهد:
قبل از شروع پخش، پیشنمایشی از نحوه نمایش فید وبکم در دستگاه میزبان را مشاهده کنید.
فید وبکم ارسالی به میزبان را به روشهای زیر سفارشی کنید:
- انتخاب دوربین برای پخش جریانی، جلو یا عقب.
- انتخاب سطح بزرگنمایی با استفاده از یک نوار لغزنده یا دکمهها.
- ضربه زدن روی یک ناحیه خاص از پیشنمایش برای فوکوس یا حذف فوکوس روی یک ناحیه.
فعالیت پیشنمایش با ویژگیهای عمومی دسترسی در اندروید مانند TalkBack ، Switch Access و Voice Access کار میکند.

شکل ۱. تصویر وبکم در حال پخش به یک میزبان با پیشنمایشی که تصویر را کنترل میکند.
معماری
معماری پشتیبانی از استفاده از یک دستگاه به عنوان وبکم در شکل 2 نشان داده شده است. در ادامه، جریان تعامل سرویس DeviceAsWebcam با بقیه چارچوب اندروید شرح داده شده است:
- کاربر گزینه وبکم USB را در برنامه تنظیمات انتخاب میکند.
- برنامه تنظیمات از طریق کلاس
UsbManagerیک فراخوانی binder بهsystem_serverارسال میکند و به آن اطلاع میدهد کهFUNCTION_UVCانتخاب شده است. - سرور سیستم موارد زیر را انجام میدهد:
- به دستگاه USB HAL اطلاع میدهد که از طریق فراخوانی رابط
setUsbFunctionsHAL، تابع دستگاه UVC را بازیابی کند. - به ابزار USB HAL اطلاع میدهد که درایور ابزار UVC را با استفاده از ConfigFs پیکربندی کند.
- به دستگاه USB HAL اطلاع میدهد که از طریق فراخوانی رابط
- پس از دریافت یک فراخوانی از ابزار HAL،
system_serverیک broadcast به فریمورک ارسال میکند تا توسط سرویسDeviceAsWebcamدریافت شود. - درایور گجت USB پس از دریافت دستورات پیکربندی از میزبان از طریق گرههای V4L2 در
/dev/video*استریم وبکم را آغاز میکند.

شکل ۲. معماری DeviceAsWebcam.
پیادهسازی
این بخش نحوه پشتیبانی از استفاده از دستگاه اندروید به عنوان وب کم را شرح میدهد.
پشتیبانی از هسته
برای اندروید ۱۴ یا بالاتر، تصویر هسته عمومی (GKI) به طور پیشفرض درایور ابزار UVC را فعال میکند (جزئیات را در وصله AOSP ببینید).
پشتیبانی از UVC در گجت HAL
از اندروید ۱۴ به بعد، تابع UVC در رابط GadgetFunction.aidl HAL گنجانده شده است. برای Gadget HAL، گجت UVC به همان روشی که سایر توابع ConfigFS مانند MTP یا ADB روی ConfigFS نصب میشوند، روی آن نصب میشود.
برای پیادهسازی 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 HAL ترکیبهای VID/PID مناسب را نمایش میدهد.
از آنجا که تمام منطق UVC یا در vendor init یا در سرویس DeviceAsWebcam قرار دارد، هیچ منطق خاص UVC، به غیر از پیوند نمادین تابع UVC به ConfigFS، در Gadget HAL مورد نیاز نیست.
برای راهنمایی بیشتر در مورد پیادهسازی، به نمونه کد زیر در AOSP مراجعه کنید:
پیکربندی ConfigFS را با تنظیمات UVC راهاندازی کنید
برای اطلاع دادن به درایور گجت UVC که کدام فرمتها، اندازهها و نرخ فریمها توسط وبکم اندروید پشتیبانی میشوند، ConfigFS را با پیکربندیهای UVC راهاندازی کنید. برای اطلاعات بیشتر، به مستندات بالادستی لینوکس در مورد ConfigFS UVC gadget ABI مراجعه کنید.
در زیر مثالی از نحوه تنظیم درایور گجت UVC توسط vendor init ( قطعه کد در 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 اطلاع داده میشوند.
دستورالعملهای کلی برای انتخاب پیکربندیهایی که وبکم تبلیغ میکند، به شرح زیر است:
- The two stream formats supported by the
DeviceAsWebcamservice are MJPEG and uncompressed YUYV. - USB 2.0 از انتقال داده با سرعت ۴۸۰ مگابیت در ثانیه (۶۰ مگابایت در ثانیه) پشتیبانی میکند. این بدان معناست که در سرعت ۳۰ فریم در ثانیه، هر فریم باید حداکثر ۲ مگابایت و در سرعت ۶۰ فریم در ثانیه، حداکثر ۱ مگابایت باشد.
- جریانهای فشرده نشده (YUYV): در سرعت 30 فریم در ثانیه، حداکثر اندازه فریم پشتیبانی شده 720p است زیرا YUYV برابر با 2 بایت در هر پیکسل است.
- جریانهای فشرده MJPEG: با فرض نسبت فشردهسازی ۱:۱۰ از YUV، USB 2.0 میتواند از ۴K (۱.۱۸ مگابایت در هر فریم) پشتیبانی کند.
- دستگاههای دوربین اصلی جلو و عقب باید از تمام اندازههای فریم تبلیغشده پشتیبانی کنند. دلیل این امر این است که کاربر میتواند با استفاده از رابط کاربری پیشنمایش، بین شناسههای دوربین جابهجا شود. برای استریمهای MJPEG، به فروشندگان توصیه میکنیم اندازههای فریم 480p (640 x 480)، 720p (1280 x 820) و 1080p (1920 x 1080) را تبلیغ کنند، زیرا این اندازهها معمولاً توسط برنامههای میزبان استفاده میشوند.
- دستگاههای دوربین اصلی جلو و عقب باید از تمام نرخ فریمهای تبلیغشده پشتیبانی کنند. ما اکیداً توصیه میکنیم که فروشندگان از 30 فریم در ثانیه پشتیبانی کنند.
برای مثالی از افزودن پیکربندیهای جریان وبکم (ConfigFS)، به وصله نمونه AOSP مراجعه کنید.
فعال کردن وبکم در نسخه آزمایشی
برای فعال کردن سرویس DeviceAsWebcam ، باید ویژگی سیستم ro.usb.uvc.enabled را در فایل device.mk روی true تنظیم کنید.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
وقتی این ویژگی سیستم فعال باشد، گزینه وبکم در برنامه تنظیمات، زیر تنظیمات USB، همانطور که در شکل ۳ نشان داده شده است، ظاهر میشود. وقتی این گزینه انتخاب شود، دستگاه اندروید به عنوان یک وبکم USB برای دستگاه میزبان ظاهر میشود.

شکل ۳. تنظیمات 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 که برای استفاده از شناسه دوربین فیزیکی ۳ به جای شناسه دوربین منطقی ۰ تنظیم شده است، آمده است. برای مثال در AOSP، به DeviceAsWebcamRaven مراجعه کنید.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
تأیید
برای آزمایش پیادهسازی سرویس DeviceAsWebcam روی دستگاهتان، از تستهای زیر استفاده کنید:
- وب کم تست تأییدکننده CTS: بررسی کنید که فرمتها، اندازهها و نرخ فریم توسط دستگاه پشتیبانی میشوند.
- تستهای دستی: بررسی کنید که آیا ویژگی وبکم با انواع برنامههای میزبان در انواع سیستم عاملهای میزبان کار میکند یا خیر.
مشکلات شناخته شده
مشکلات شناختهشدهی سرویس DeviceAsWebcam به شرح زیر است:
جریان درایور گجت UVC گاهی اوقات سوسو میزند و چیزی شبیه فریمهای خراب نشان میدهد. این مشکل برطرف شده و در بالادست و در GKI ادغام شده است.
دستگاههای اندروید در حالت وبکم با کابلهای USB 3.0+ در میزبانهای macOS به دلیل وجود اشکال در درایور UVC اپل کار نمیکنند.