অ্যান্ড্রয়েড ১৪ কিউপিআর১ বা তার উচ্চতর ভার্সন চালিত ডিভাইসগুলির জন্য, অ্যান্ড্রয়েড ডিভাইসটিকে একটি ইউএসবি ওয়েবক্যাম হিসেবে ব্যবহার সমর্থন করে। এই বৈশিষ্ট্যটি সমর্থনকারী অ্যান্ড্রয়েড ডিভাইসগুলিকে একটি ইউভিসি ডিভাইস হিসেবে বিজ্ঞাপন দেওয়া হয়, যা বিভিন্ন অপারেটিং সিস্টেম (উদাহরণস্বরূপ, লিনাক্স, ম্যাকওএস, উইন্ডোজ এবং ChromeOS) সহ বিস্তৃত পরিসরের ইউএসবি হোস্টকে ডিভাইসের ক্যামেরাকে ওয়েবক্যাম হিসেবে ব্যবহার করতে দেয়। ডিভাইসটিকে ওয়েবক্যাম হিসেবে ব্যবহার করার জন্য ডিভাইসটিকে DeviceAsWebcam পরিষেবা এই বৈশিষ্ট্যটিকে সমর্থন করে।
DeviceAsWebcam পরিষেবা
AOSP-এর DeviceAsWebcam পরিষেবাটিতে একটি প্রিভিউ অ্যাক্টিভিটি ( DeviceAsWebcamPreview.java ) অন্তর্ভুক্ত থাকে যা ব্যবহারকারীদের দৃশ্যটি ফ্রেম করতে দেয়। প্রিভিউ অ্যাক্টিভিটি ব্যবহারকারীকে নিম্নলিখিতগুলি করতে দেয়:
স্ট্রিমিং শুরু হওয়ার আগে হোস্ট মেশিনে ওয়েবক্যাম ফিড কেমন দেখাবে তা পূর্বরূপ দেখুন।
হোস্টে পাঠানো ওয়েবক্যাম ফিডটি নিম্নলিখিত উপায়ে কাস্টমাইজ করুন:
- সামনে বা পিছনে স্ট্রিম করার জন্য ক্যামেরা নির্বাচন করা।
- স্লাইডার বা বোতাম ব্যবহার করে জুম লেভেল নির্বাচন করা।
- কোনও অঞ্চলের উপর ফোকাস ফোকাস করতে বা সরাতে প্রিভিউয়ের একটি নির্দিষ্ট অঞ্চলে ট্যাপ করা।
প্রিভিউ অ্যাক্টিভিটি অ্যান্ড্রয়েডে টকব্যাক , সুইচ অ্যাক্সেস এবং ভয়েস অ্যাক্সেসের মতো সাধারণ অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলির সাথে কাজ করে।

চিত্র ১. ওয়েবক্যাম ফিড একটি হোস্টে স্ট্রিম করা হচ্ছে যেখানে প্রিভিউ ফিড নিয়ন্ত্রণ করছে।
স্থাপত্য
একটি ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহার করার জন্য যে আর্কিটেকচারটি ব্যবহার করা হবে তা চিত্র ২-এ দেখানো হয়েছে। নিম্নলিখিতটি অ্যান্ড্রয়েড ফ্রেমওয়ার্কের বাকি অংশের সাথে DeviceAsWebcam পরিষেবার মিথস্ক্রিয়া প্রবাহ বর্ণনা করে:
- ব্যবহারকারী সেটিংস অ্যাপে USB ওয়েবক্যাম বিকল্পটি নির্বাচন করেন।
- সেটিংস অ্যাপটি
UsbManagerক্লাসের মাধ্যমেsystem_serverএ একটি বাইন্ডার কল পাঠায় এবংFUNCTION_UVCনির্বাচিত হয়েছে বলে জানায়। - সিস্টেম সার্ভার নিম্নলিখিত কাজগুলি করে:
- একটি
setUsbFunctionsHAL ইন্টারফেস কলের মাধ্যমে UVC গ্যাজেট ফাংশন পুনরুদ্ধার করতে USB গ্যাজেট HAL কে অবহিত করে। - USB গ্যাজেট HAL কে ConfigF ব্যবহার করে UVC গ্যাজেট ড্রাইভার কনফিগার করতে অবহিত করে।
- একটি
- HAL গ্যাজেট থেকে কলব্যাক পাওয়ার পর,
system_serverDeviceAsWebcamপরিষেবা দ্বারা সংগ্রহ করার জন্য ফ্রেমওয়ার্কে একটি সম্প্রচার পাঠায়। -
/dev/video*এ V4L2 নোডের মাধ্যমে হোস্ট থেকে কনফিগারেশন কমান্ড পাওয়ার পর USB গ্যাজেট ড্রাইভার ওয়েবক্যাম স্ট্রিম শুরু করে।

চিত্র ২। DeviceAsWebcam আর্কিটেকচার।
বাস্তবায়ন
এই বিভাগে একটি অ্যান্ড্রয়েড ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহার করার পদ্ধতি বর্ণনা করা হয়েছে।
কার্নেল সাপোর্ট
অ্যান্ড্রয়েড ১৪ বা তার উচ্চতর সংস্করণের জন্য, জেনেরিক কার্নেল ইমেজ (GKI) ডিফল্টরূপে UVC গ্যাজেট ড্রাইভার সক্ষম করে ( AOSP প্যাচে বিস্তারিত দেখুন)।
গ্যাজেট HAL-এ UVC সাপোর্ট করুন
Android 14 থেকে শুরু করে, UVC ফাংশনটি GadgetFunction.aidl HAL ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে। Gadget HAL-এর জন্য, UVC গ্যাজেটটি MTP বা ADB-এর মতো অন্যান্য ConfigFS ফাংশনের মতোই ConfigFS-এ মাউন্ট করা হয়েছে।
গ্যাজেট HAL বাস্তবায়নের জন্য, UVC ফাংশনটি ConfigFS-এ মাউন্ট করার জন্য পরিবর্তন করুন। UVC ফাংশন সমর্থনকারী একটি গ্যাজেট HAL বাস্তবায়নের একটি উদাহরণ স্নিপেট নিচে দেওয়া হল:
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 পরিষেবাতে থাকে, তাই Gadget HAL-এ UVC ফাংশনকে ConfigFS-এর সাথে সিমলিঙ্ক করা ছাড়া অন্য কোনও UVC নির্দিষ্ট লজিকের প্রয়োজন হয় না।
বাস্তবায়নের বিষয়ে আরও নির্দেশনার জন্য, AOSP-তে নিম্নলিখিত নমুনা কোডটি দেখুন:
UVC কনফিগারেশনের সাথে ConfigFS সেট আপ করুন
UVC গ্যাজেট ড্রাইভারকে জানাতে যে কোন ফর্ম্যাট, আকার এবং ফ্রেম রেট Android ওয়েবক্যাম দ্বারা সমর্থিত, UVC কনফিগারেশন সহ ConfigFS সেট আপ করুন। আরও তথ্যের জন্য, ConfigFS UVC গ্যাজেট ABI- তে আপস্ট্রিম Linux ডকুমেন্টেশন দেখুন।
Vendor init কীভাবে UVC গ্যাজেট ড্রাইভার ( 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 গ্যাজেট ড্রাইভারকে ৩০ fps-এ ১০৮০p MJPEG স্ট্রিম বিজ্ঞাপনের জন্য সেট আপ করে। যখন USB হোস্ট সমর্থিত রেজোলিউশন এবং ফ্রেম রেট সম্পর্কে জিজ্ঞাসা করে তখন এই ক্ষমতাগুলি তার সাথে যোগাযোগ করা হয়।
ওয়েবক্যাম যে কনফিগারেশনগুলি বিজ্ঞাপন দেয় তা নির্বাচন করার জন্য নিম্নলিখিত সাধারণ নির্দেশিকাগুলি রয়েছে:
-
DeviceAsWebcamপরিষেবা দ্বারা সমর্থিত দুটি স্ট্রিম ফর্ম্যাট হল MJPEG এবং আনকম্প্রেসড YUYV। - USB 2.0 480 Mbps (60 MBps) ডেটা স্থানান্তর সমর্থন করে। এর মানে হল 30 fps এ, প্রতিটি ফ্রেমের সর্বোচ্চ আকার 2 MB হতে হবে; এবং 60 fps এ, সর্বোচ্চ আকার 1 MB হতে হবে।
- আনকম্প্রেসড স্ট্রিম (YUYV): 30 fps এ, সর্বাধিক সমর্থিত ফ্রেমের আকার 720p কারণ YUYV প্রতি পিক্সেল 2 বাইট।
- সংকুচিত MJPEG স্ট্রিম: YUV থেকে 1:10 সংকোচন অনুপাত ধরে নিলে, USB 2.0 4K (প্রতি ফ্রেমে 1.18 MB) সমর্থন করতে পারে।
- প্রাথমিক সামনের এবং পিছনের ক্যামেরা ডিভাইসগুলিকে বিজ্ঞাপনে প্রদর্শিত সমস্ত ফ্রেম আকার সমর্থন করতে হবে। এর কারণ হল ব্যবহারকারী প্রিভিউ UI ব্যবহার করে ক্যামেরা আইডিগুলির মধ্যে স্যুইচ করতে পারবেন। MJPEG স্ট্রিমগুলির জন্য, আমরা বিক্রেতাদের 480p (640 x 480), 720p (1280 x 820) এবং 1080p (1920 x 1080) ফ্রেম আকারের বিজ্ঞাপন দেওয়ার পরামর্শ দিচ্ছি কারণ এগুলি সাধারণত হোস্ট অ্যাপগুলিতে ব্যবহৃত হয়।
- প্রাথমিক সামনের এবং পিছনের ক্যামেরা ডিভাইসগুলিকে বিজ্ঞাপনে প্রদত্ত সমস্ত ফ্রেম রেট সমর্থন করতে হবে। আমরা দৃঢ়ভাবে বিক্রেতাদের 30 fps সমর্থন করার পরামর্শ দিচ্ছি।
ওয়েবক্যাম স্ট্রিম কনফিগারেশন (ConfigFS) যোগ করার উদাহরণের জন্য, AOSP নমুনা প্যাচ দেখুন।
বিল্ডে ওয়েবক্যাম সক্ষম করুন
DeviceAsWebcam পরিষেবা সক্রিয় করতে, আপনাকে device.mk ফাইলে ro.usb.uvc.enabled সিস্টেম বৈশিষ্ট্যটিকে true তে সেট করতে হবে।
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
যখন এই সিস্টেম বৈশিষ্ট্যটি সক্রিয় করা হয়, তখন চিত্র 3-এ দেখানো USB পছন্দগুলির অধীনে সেটিংস অ্যাপে একটি ওয়েবক্যাম বিকল্প উপস্থিত হয়। বিকল্পটি নির্বাচন করা হলে, অ্যান্ড্রয়েড ডিভাইসটি হোস্ট ডিভাইসে একটি USB ওয়েবক্যাম হিসাবে উপস্থিত হয়।

চিত্র ৩। সেটিংস অ্যাপে USB পছন্দ।
আপনি এই কমান্ড ব্যবহার করে ADB এর মাধ্যমে ডিভাইসটিকে USB ওয়েবক্যাম ফাংশনে সেট করতে পারেন:
adb shell svc usb setFunctions uvcবিদ্যুৎ এবং তাপ সংক্রান্ত উদ্বেগ বিবেচনা করুন
ওয়েবক্যাম অপারেশনের অর্থ হল একটি ডিভাইসের ক্যামেরা দিনে একাধিক ঘন্টা ধরে চালু থাকতে পারে, তাই আমরা ডিভাইসের বিদ্যুৎ খরচ এবং তাপীয়তা নির্দিষ্ট সীমার মধ্যে রাখার জন্য ব্যবস্থা গ্রহণের পরামর্শ দিচ্ছি। বিদ্যুৎ খরচ সীমার মধ্যে রাখার জন্য নিম্নলিখিত প্রস্তাবিত সমাধানগুলি দেওয়া হল:
- HAL ক্যামেরা থেকে আরও ভালো পাওয়ার পারফরম্যান্সের জন্য,
DeviceAsWebcamপরিষেবাতেSTREAM_USE_CASE_VIDEO_CALLসক্ষম করুন। STREAM_USE_CASE_VIDEO_CALLসক্ষম থাকা সত্ত্বেও যদি বিদ্যুৎ সমস্যা হয়, তাহলেDeviceAsWebcamপরিষেবাটি ফিজিক্যাল স্ট্রিম ব্যবহার করে বিদ্যুৎ খরচ আরও কমানোর একটি বিকল্প প্রদান করে। আপনি কোন ফিজিক্যাল ক্যামেরা ব্যবহার করবেন তা নির্দিষ্ট করতে রানটাইম রিসোর্স ওভারলে (RRO) ব্যবহার করতে পারেন। ফিজিক্যাল স্ট্রিমগুলি ভিডিওর মান উল্লেখযোগ্যভাবে হ্রাস করে এবং একটি বিভ্রান্তিকর UX তৈরি করে, তাই এই সমাধানটি শুধুমাত্র শেষ অবলম্বন হিসাবে ব্যবহার করুন।STREAM_USE_CASE_VIDEO_CALLঅপ্টিমাইজ করা হল পাওয়ার সমস্যাগুলির জন্য পছন্দের সমাধান।DeviceAsWebcamপরিষেবা দ্বারা সমর্থিত RRO সম্পর্কে আরও তথ্যের জন্য, readme.md দেখুন।লজিক্যাল ক্যামেরা আইডি 0 এর পরিবর্তে ফিজিক্যাল ক্যামেরা আইডি 3 ব্যবহার করার জন্য সেট আপ করা একটি RRO এর উদাহরণ নিচে দেওয়া হল। AOSP-তে একটি উদাহরণের জন্য, DeviceAsWebcamRaven দেখুন।
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
যাচাইকরণ
আপনার ডিভাইসে DeviceAsWebcam পরিষেবার বাস্তবায়ন পরীক্ষা করতে, নিম্নলিখিত পরীক্ষাগুলি ব্যবহার করুন:
- CTS যাচাইকারী পরীক্ষা ওয়েবক্যাম : ডিভাইসটি ফর্ম্যাট, আকার এবং ফ্রেম রেট সমর্থিত কিনা তা পরীক্ষা করুন।
- ম্যানুয়াল পরীক্ষা: ওয়েবক্যাম বৈশিষ্ট্যটি বিভিন্ন হোস্ট অপারেটিং সিস্টেমের বিভিন্ন হোস্ট অ্যাপের সাথে কাজ করে কিনা তা পরীক্ষা করুন।
জ্ঞাত সমস্যা
DeviceAsWebcam পরিষেবার জন্য নিম্নলিখিত সমস্যাগুলি জানা আছে:
UVC গ্যাজেট ড্রাইভারের স্ট্রিম কখনও কখনও ঝিকিমিকি করে এবং দূষিত ফ্রেমের মতো দেখায়। এই সমস্যাটি সমাধান করা হয়েছে এবং আপস্ট্রিম এবং GKI-তে মার্জ করা হয়েছে।
অ্যাপলের UVC ড্রাইভারের একটি ত্রুটির কারণে, macOS হোস্টে ওয়েবক্যাম মোডে থাকা অ্যান্ড্রয়েড ডিভাইসগুলি USB 3.0+ কেবলের সাথে কাজ করে না।