Android 14-QPR1 বা উচ্চতর সংস্করণে চলমান ডিভাইসগুলির জন্য, Android একটি USB ওয়েবক্যাম হিসাবে ডিভাইস ব্যবহার করা সমর্থন করে। এই বৈশিষ্ট্যটিকে সমর্থন করে এমন অ্যান্ড্রয়েড ডিভাইসগুলিকে একটি UVC ডিভাইস হিসাবে বিজ্ঞাপন দেওয়া হয়, যা বিভিন্ন অপারেটিং সিস্টেমের (উদাহরণস্বরূপ, Linux, macOS, Windows, এবং ChromeOS) সাথে একটি বিস্তৃত USB হোস্টকে ডিভাইসের ক্যামেরাকে ওয়েবক্যাম হিসাবে ব্যবহার করতে দেয়৷ DeviceAsWebcam
পরিষেবাটি একটি ওয়েবক্যাম হিসাবে ডিভাইসটি ব্যবহার করতে এই বৈশিষ্ট্যটিকে সমর্থন করে৷
DeviceAsWebcam পরিষেবা
AOSP-এর DeviceAsWebcam
পরিষেবাটিতে একটি প্রিভিউ অ্যাক্টিভিটি ( DeviceAsWebcamPreview.java
) রয়েছে যা ব্যবহারকারীদের দৃশ্য ফ্রেম করতে দেয়। পূর্বরূপ কার্যকলাপ ব্যবহারকারীকে নিম্নলিখিত করতে দেয়:
স্ট্রিমিং শুরু হওয়ার আগে হোস্ট মেশিনে ওয়েবক্যাম ফিড কেমন দেখাবে তা পূর্বরূপ দেখুন।
নিম্নলিখিত উপায়ে হোস্টে পাঠানো ওয়েবক্যাম ফিড কাস্টমাইজ করুন:
- সামনে বা পিছনে স্ট্রিম করার জন্য ক্যামেরা নির্বাচন করা হচ্ছে।
- একটি স্লাইডার বা বোতাম ব্যবহার করে জুম স্তর নির্বাচন করা।
- একটি অঞ্চলে ফোকাস ফোকাস বা সরাতে পূর্বরূপের একটি নির্দিষ্ট অঞ্চলে আলতো চাপুন৷
পূর্বরূপ ক্রিয়াকলাপটি Android এ সাধারণ অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলির সাথে কাজ করে যেমন টকব্যাক , সুইচ অ্যাক্সেস এবং ভয়েস অ্যাক্সেস ।
চিত্র 1. ওয়েবক্যাম ফিড একটি হোস্টে স্ট্রিম করা হচ্ছে এবং ফিড নিয়ন্ত্রণের পূর্বরূপ।
স্থাপত্য
একটি ওয়েবক্যাম হিসাবে একটি ডিভাইস ব্যবহার করে সমর্থন করার আর্কিটেকচারটি চিত্র 2-এ চিত্রিত করা হয়েছে৷ নিম্নলিখিতটি Android ফ্রেমওয়ার্কের বাকি অংশের সাথে DeviceAsWebcam
পরিষেবার মিথস্ক্রিয়া প্রবাহকে বর্ণনা করে:
- ব্যবহারকারী সেটিংস অ্যাপে USB ওয়েবক্যাম বিকল্পটি নির্বাচন করেন।
- সেটিংস অ্যাপটি
UsbManager
ক্লাসের মাধ্যমেsystem_server
একটি বাইন্ডার কল পাঠায় এবং এটি জানায় যেFUNCTION_UVC
নির্বাচন করা হয়েছে। - সিস্টেম সার্ভার নিম্নলিখিত কাজ করে:
- একটি
setUsbFunctions
HAL ইন্টারফেস কলের মাধ্যমে UVC গ্যাজেট ফাংশন পুনরুদ্ধার করতে USB গ্যাজেট HAL-কে জানায়৷ - ConfigFs ব্যবহার করে UVC গ্যাজেট ড্রাইভার কনফিগার করতে USB গ্যাজেট HAL-কে জানায়।
- একটি
- গ্যাজেট HAL থেকে একটি কলব্যাক প্রাপ্তির পরে,
system_server
ফ্রেমওয়ার্কে একটি সম্প্রচার পাঠায় যাDeviceAsWebcam
পরিষেবা দ্বারা নেওয়া হবে৷ - USB গ্যাজেট ড্রাইভার
/dev/video*
এ V4L2 নোডের মাধ্যমে হোস্টের কাছ থেকে কনফিগারেশন কমান্ড পাওয়ার পরে ওয়েবক্যাম স্ট্রীম শুরু করে।
চিত্র 2. DeviceAsWebcam আর্কিটেকচার।
বাস্তবায়ন
এই বিভাগটি বর্ণনা করে যে কীভাবে একটি অ্যান্ড্রয়েড ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহার করে সমর্থন করা যায়।
কার্নেল সমর্থন
Android 14 বা তার বেশির জন্য, জেনেরিক কার্নেল ইমেজ (GKI) ডিফল্টরূপে UVC গ্যাজেট ড্রাইভারকে সক্ষম করে ( AOSP প্যাচে বিস্তারিত দেখুন)।
গ্যাজেট HAL-এ UVC সমর্থন করুন
Android 14 দিয়ে শুরু করে, UVC ফাংশন GadgetFunction.aidl
HAL ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে। গ্যাজেট HAL-এর জন্য, UVC গ্যাজেটটি ConfigFS-এ একইভাবে মাউন্ট করা হয় যেমন MTP বা ADB-এর মতো অন্যান্য 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
পরিষেবাতে রয়েছে, তাই গ্যাজেট HAL-এ UVC ফাংশনকে ConfigFS-এ সিমলিংক করা ছাড়া অন্য কোনও UVC নির্দিষ্ট যুক্তির প্রয়োজন নেই৷
বাস্তবায়নের বিষয়ে আরও নির্দেশনার জন্য, AOSP-তে নিম্নলিখিত নমুনা কোডটি দেখুন:
UVC কনফিগারেশন সহ ConfigFS সেট আপ করুন
UVC গ্যাজেট ড্রাইভারকে জানাতে যে কোন ফর্ম্যাট, আকার এবং ফ্রেম রেটগুলি Android ওয়েবক্যাম দ্বারা সমর্থিত, UVC কনফিগারেশন সহ ConfigFS সেট আপ করুন৷ আরও তথ্যের জন্য, কনফিগএফএস ইউভিসি গ্যাজেট ABI- তে আপস্ট্রিম লিনাক্স ডকুমেন্টেশন দেখুন।
নিচের একটি উদাহরণ হল কিভাবে ভেন্ডর 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
# ...
এই স্নিপেটটি 30 fps এ একটি 1080p MJPEG স্ট্রীম বিজ্ঞাপন দেওয়ার জন্য UVC গ্যাজেট ড্রাইভার সেট আপ করে৷ এই ক্ষমতাগুলি USB হোস্টের সাথে যোগাযোগ করা হয় যখন এটি সমর্থিত রেজোলিউশন এবং ফ্রেম রেটগুলি জিজ্ঞাসা করে।
ওয়েবক্যাম যে কনফিগারেশনের বিজ্ঞাপন দেয় তা নির্বাচন করার জন্য নিম্নলিখিত সাধারণ নির্দেশিকা রয়েছে:
-
DeviceAsWebcam
পরিষেবা দ্বারা সমর্থিত দুটি স্ট্রিম ফরম্যাট হল MJPEG এবং uncompressed 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 পছন্দগুলির অধীনে সেটিংস অ্যাপে একটি ওয়েবক্যাম বিকল্প উপস্থিত হয়। বিকল্পটি নির্বাচন করা হলে, হোস্ট ডিভাইসে Android ডিভাইসটি একটি USB ওয়েবক্যাম হিসাবে উপস্থিত হয়।
চিত্র 3. সেটিংস অ্যাপে USB পছন্দগুলি৷
আপনি এই কমান্ডটি ব্যবহার করে ADB এর মাধ্যমে USB ওয়েবক্যাম ফাংশনে ডিভাইসটিকে সেট করতে পারেন:
adb shell svc usb setFunctions uvc
শক্তি এবং তাপ উদ্বেগ বিবেচনা করুন
ওয়েবক্যাম অপারেশনের অর্থ হল একটি ডিভাইসের ক্যামেরা দিনে একাধিক ঘন্টার জন্য চালু থাকতে পারে, তাই আমরা নিশ্চিত করার জন্য ব্যবস্থা নেওয়ার পরামর্শ দিই যে ডিভাইসের বিদ্যুৎ খরচ এবং তাপ নির্দিষ্ট সীমার মধ্যে থাকে। বিদ্যুতের ব্যবহার সীমার মধ্যে রাখার জন্য নিম্নলিখিতগুলি সুপারিশ করা হয়েছে:
- ক্যামেরা HAL থেকে আরও ভাল পাওয়ার পারফরম্যান্সের জন্য,
DeviceAsWebcam
পরিষেবাতেSTREAM_USE_CASE_VIDEO_CALL
সক্ষম করুন৷ STREAM_USE_CASE_VIDEO_CALL
সক্ষম থাকা সত্ত্বেও যদি পাওয়ার একটি উদ্বেগের বিষয় হয়, তাহলেDeviceAsWebcam
পরিষেবাটি শারীরিক স্ট্রিমগুলি ব্যবহার করে আরও শক্তি খরচ কমানোর বিকল্প প্রদান করে৷ কোন ফিজিক্যাল ক্যামেরা ব্যবহার করতে হবে তা নির্দিষ্ট করতে আপনি রানটাইম রিসোর্স ওভারলে (RROs) ব্যবহার করতে পারেন। শারীরিক স্ট্রীমগুলি ভিডিওর গুণমানকে উল্লেখযোগ্যভাবে হ্রাস করে এবং একটি বিভ্রান্তিকর 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-এ একত্রিত করা হয়েছে।
Apple এর UVC ড্রাইভারের সাথে একটি বাগ থাকার কারণে ওয়েবক্যাম মোডে থাকা Android ডিভাইসগুলি MacOS হোস্টে USB 3.0+ তারের সাথে কাজ করে না৷