برای دستگاههای دارای 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
با بقیه چارچوب اندروید توضیح داده شده است:
- کاربر گزینه وب کم USB را در برنامه تنظیمات انتخاب می کند.
- برنامه تنظیمات از طریق کلاس
UsbManager
یک تماس بایندر بهsystem_server
ارسال می کند و به آن اطلاع می دهد کهFUNCTION_UVC
انتخاب شده است. - سرور سیستم کارهای زیر را انجام می دهد:
- به ابزار USB HAL اطلاع می دهد تا عملکرد ابزار UVC را از طریق یک تماس رابط
setUsbFunctions
HAL بازیابی کند. - به ابزار USB HAL اطلاع می دهد تا درایور ابزار UVC را با استفاده از ConfigFs پیکربندی کند.
- به ابزار USB HAL اطلاع می دهد تا عملکرد ابزار UVC را از طریق یک تماس رابط
- پس از دریافت یک تماس از ابزار HAL،
system_server
یک پخش را به فریمورک ارسال می کند تا توسط سرویسDeviceAsWebcam
دریافت شود. - درایور ابزار 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
شناخته شده است:
جریان درایور گجت UVC گاهی اوقات سوسو میزند و چیزی شبیه فریمهای خراب را نشان میدهد. این مشکل رفع شده و در بالادست و در GKI ادغام شده است.
دستگاههای Android در حالت وبکم با کابلهای USB 3.0+ در میزبانهای macOS کار نمیکنند، زیرا درایور UVC اپل مشکل دارد.