در دستگاههای دارای Android 14 QPR1 یا بالاتر، Android از استفاده از دستگاه بهعنوان وببین USB پشتیبانی میکند. دستگاههای Android که از این ویژگی پشتیبانی میکنند بهعنوان دستگاه UVC تبلیغ میشوند که به طیف وسیعی از میزبانهای USB با سیستمعاملهای مختلف (برای مثال، Linux، macOS، Windows، و ChromeOS) اجازه میدهد از دوربین دستگاه بهعنوان وبکم استفاده کنند. خدمات DeviceAsWebcam
از این ویژگی برای استفاده از دستگاه بهعنوان وبکم پشتیبانی میکند.
سرویس DeviceAsWebcam
سرویس DeviceAsWebcam در AOSP شامل فعالیت پیشنمایشی
(DeviceAsWebcamPreview.java) است که به کاربران امکان میدهد صحنه را قاببندی کنند. فعالیت پیشنمایش به کاربر امکان میدهد کارهای زیر را انجام دهد:
پیشنمایش فید وبکم را در دستگاه میزبان قبلاز شروع جاریسازی ببینید.
فید وبکم ارسالی به میزبان را به روشهای زیر سفارشیسازی کنید:
- انتخاب دوربین برای جاریسازی، جلو یا پشت.
- انتخاب سطح بزرگنمایی بااستفاده از لغزنده یا دکمهها.
- تکضرب زدن روی ناحیه خاصی از پیشنمایش برای کانونی کردن یا برداشتن کانون از روی ناحیه.
فعالیت پیشنمایش با ویژگیهای دسترسپذیری عمومی در Android مانند TalkBack، دسترسی با کلید، و دسترسی با صدا کار میکند.
شکل ۱. فید وببین به میزبان جاریسازی میشود و پیشنمایش فید را کنترل میکند.
معماری
معماری پشتیبانی از استفاده از دستگاه بهعنوان وببین در
شکل ۲ نشان داده شده است. در زیر جریان تعامل سرویس DeviceAsWebcam
با بقیه چارچوب Android شرح داده شده است:
- کاربر گزینه وبکم USB را در برنامه «تنظیمات» انتخاب میکند.
- برنامه «تنظیمات» ازطریق کلاس
UsbManagerباsystem_serverتماس گیره ارسال میکند و به آن اطلاع میدهد کهFUNCTION_UVCانتخاب شده است. - کار سرور سیستم این است:
- به HAL ابزار USB اطلاع میدهد که عملکرد ابزار UVC را ازطریق
فراخوانی میانای HAL
setUsbFunctionsبازیابی کند. - به HAL ابزارک USB اطلاع میدهد که درایور ابزارک UVC را بااستفاده از ConfigFs پیکربندی کند.
- به HAL ابزار USB اطلاع میدهد که عملکرد ابزار UVC را ازطریق
فراخوانی میانای HAL
- پساز دریافت تماس برگشتی از HAL ابزارک،
system_serverیک همهفرستی به چارچوب ارسال میکند تا توسط سرویسDeviceAsWebcamدریافت شود. - درایور ابزارک USB با دریافت دستورات پیکربندی از میزبان ازطریق گرههای V4L2 در
/dev/video*، جاریسازی وبکم را شروع میکند.
شکل ۲. معماری «دستگاه بهعنوان وبکم».
پیادهسازی
این بخش نحوه پشتیبانی از استفاده از دستگاه Android بهعنوان وبکم را توضیح میدهد.
پشتیبانی هسته
برای Android 14 یا بالاتر، «تصویر هسته عمومی» (GKI) بهطور پیشفرض درایور ابزارک UVC را فعال میکند (جزئیات را در وصله AOSP ببینید).
پشتیبانی از UVC در Gadget HAL
از Android 14، تابع 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
...
}
...
}
وقتی دستگاه بهعنوان وببین عمل میکند، مطمئن شوید که HAL ابزارک USB ترکیبهای VID/PID مناسب را تبلیغ میکند.
ازآنجاییکه همه منطق UVC یا در مقداردهی اولیه فروشنده یا در DeviceAsWebcam
سرویس است، هیچ منطق خاص UVC، بهجز پیوند نمادین تابع UVC به
ConfigFS، در Gadget HAL لازم نیست.
برای راهنمایی بیشتر درباره پیادهسازی، کد نمونه زیر را در AOSP ببینید:
راهاندازی ConfigFS با پیکربندیهای UVC
برای اینکه به درایور ابزارک UVC اطلاع دهید که وبکم Android از کدام قالبها، اندازهها، و نرخهای فریم پشتیبانی میکند، ConfigFS را با پیکربندیهای UVC راهاندازی کنید. برای اطلاعات بیشتر، به اسناد Linux بالادستی درباره 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 با وضوح ۱۰۸۰ پیکسل در ۳۰ فریم در ثانیه تبلیغ کند. این قابلیتها زمانی که میزبان USB درباره وضوح و نرخهای فریم پشتیبانیشده پرسوجو میکند به آن اعلام میشود.
در زیر دستورالعملهای کلی برای انتخاب پیکربندیهایی که وببین تبلیغ میکند آورده شده است:
- دو قالب جاریسازی پشتیبانیشده توسط سرویس
DeviceAsWebcamعبارتاند از MJPEG و فشردهنشده YUYV. - USB 2.0 از انتقال داده با سرعت ۴۸۰ مگابیت در ثانیه (۶۰ مگابایت در ثانیه) پشتیبانی میکند. این
یعنی در ۳۰ فریم در ثانیه، هر فریم باید حداکثر ۲ مگابایت باشد؛
و در ۶۰ فریم در ثانیه، حداکثر ۱ مگابایت باشد.
- جاریسازیهای فشردهنشده (YUYV): در ۳۰ فریم در ثانیه، حداکثر اندازه فریم پشتیبانیشده ۷۲۰ پیکسل است زیرا YUYV برای هر پیکسل ۲ بایت است.
- جاریسازیهای MJPEG فشرده: با فرض نسبت فشردهسازی ۱:۱۰ از YUV، USB 2.0 میتواند از 4K (۱٫۱۸ مگابایت در هر قاب) پشتیبانی کند.
- دستگاههای دوربین جلو و پشت اصلی باید از همه اندازههای قاب که تبلیغ میشود پشتیبانی کنند. به این دلیل که کاربر میتواند بااستفاده از میانای کاربر پیشنمایش بین شناسههای دوربین جابهجا شود. برای جاریسازیهای MJPEG، توصیه میکنیم فروشندگان اندازههای قاب 480p (640 x 480)، 720p (1280 x 820)، و 1080p (1920 x 1080) را تبلیغ کنند زیرا این اندازهها اندازههایی هستند که معمولاً توسط برنامههای میزبان استفاده میشوند.
- دستگاههای دوربین جلو و پشت اصلی باید از همه نرخهای فریم تبلیغشده پشتیبانی کنند. بهشدت توصیه میکنیم که فروشندگان از ۳۰ فریم در ثانیه پشتیبانی کنند.
برای نمونهای از افزودن پیکربندیهای جاریسازی وبکم (ConfigFS)، به وصله نمونه AOSP مراجعه کنید.
فعال کردن وبکم در ساخت
برای فعال کردن سرویس DeviceAsWebcam، باید ویژگی سیستم ro.usb.uvc.enabled را در فایل device.mk روی true تنظیم کنید.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
وقتی این دارایی سیستم فعال باشد، گزینه وبکم در برنامه «تنظیمات» در بخش اولویتهای USB ظاهر میشود، همانطور که در «شکل ۳» نشان داده شده است. وقتی این گزینه انتخاب شود، دستگاه Android بهعنوان وبکم USB برای دستگاه میزبان نمایش داده میشود.
شکل ۳. اولویتهای USB در برنامه «تنظیمات».
همچنین میتوانید دستگاه را ازطریق ADB بااستفاده از این فرمان روی عملکرد وببین USB تنظیم کنید:
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 را ببینید.در زیر نمونهای از راهاندازی «همپوشانی منبع زمان اجرا» برای استفاده از شناسه دوربین فیزیکی ۳ بهجای شناسه دوربین منطقی ۰ ارائه شده است. برای نمونه در AOSP، به DeviceAsWebcamRaven مراجعه کنید.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
درستیسنجی
برای آزمایش پیادهسازی سرویس DeviceAsWebcam در دستگاهتان، از آزمایشهای زیر استفاده کنید:
- آزمایش درستیسنج CTS وبکم: آزمایش اینکه قالبها، اندازهها، و نرخهای فریم توسط دستگاه پشتیبانی میشوند.
- آزمایشهای دستی: آزمایش کنید که ویژگی وببین با انواع برنامههای میزبان در انواع سیستمعاملهای میزبان کار میکند.
مشکلات شناختهشده
موارد زیر مشکلات شناختهشده سرویس DeviceAsWebcam هستند:
جاریسازی درایور ابزارک UVC گاهی اوقات سوسو میزند و آنچه را که شبیه قابهای خراب است نشان میدهد. این مشکل برطرف شده است و در بالادست و GKI ادغام شده است.
دستگاههای Android در حالت وبکم بهدلیل وجود اشکال در درایور UVC شرکت Apple با کابلهای USB 3.0+ در میزبانهای macOS کار نمیکنند.