একটি ওয়েবক্যাম হিসাবে একটি ডিভাইস ব্যবহার করুন

অ্যান্ড্রয়েড ১৪ কিউপিআর১ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলোকে অ্যান্ড্রয়েড ইউএসবি ওয়েবক্যাম হিসেবে ব্যবহার করা সমর্থন করে। এই বৈশিষ্ট্য সমর্থনকারী অ্যান্ড্রয়েড ডিভাইসগুলোকে একটি ইউভিসি ডিভাইস হিসেবে প্রচার করা হয়, যা বিভিন্ন অপারেটিং সিস্টেম (যেমন, লিনাক্স, ম্যাকওএস, উইন্ডোজ এবং ক্রোমওএস) সহ বিস্তৃত পরিসরের ইউএসবি হোস্টকে ডিভাইসটির ক্যামেরা ওয়েবক্যাম হিসেবে ব্যবহার করতে দেয়। ডিভাইসটিকে ওয়েবক্যাম হিসেবে ব্যবহার করার জন্য DeviceAsWebcam সার্ভিসটি এই বৈশিষ্ট্যটি সমর্থন করে।

ডিভাইসঅ্যাজওয়েবক্যাম পরিষেবা

AOSP-এর DeviceAsWebcam সার্ভিসে একটি প্রিভিউ অ্যাক্টিভিটি ( DeviceAsWebcamPreview.java ) অন্তর্ভুক্ত রয়েছে, যা ব্যবহারকারীদের দৃশ্যটি ফ্রেম করতে দেয়। এই প্রিভিউ অ্যাক্টিভিটি ব্যবহারকারীকে নিম্নলিখিত কাজগুলো করতে দেয়:

  • স্ট্রিমিং শুরু হওয়ার আগে হোস্ট মেশিনে ওয়েবক্যাম ফিডটি কেমন দেখাবে তার প্রিভিউ দেখে নিন।

  • নিম্নলিখিত উপায়ে হোস্টের কাছে পাঠানো ওয়েবক্যাম ফিডটি কাস্টমাইজ করুন:

    • স্ট্রিম করার জন্য ক্যামেরা নির্বাচন করা, সামনের বা পেছনের।
    • স্লাইডার বা বাটন ব্যবহার করে জুম লেভেল নির্বাচন করা।
    • প্রিভিউয়ের কোনো নির্দিষ্ট অঞ্চলে ট্যাপ করে সেই অঞ্চলে ফোকাস করা বা তা থেকে ফোকাস সরানো যায়।

প্রিভিউ অ্যাক্টিভিটিটি অ্যান্ড্রয়েডের সাধারণ অ্যাক্সেসিবিলিটি ফিচার, যেমন টকব্যাক , সুইচ অ্যাক্সেস এবং ভয়েস অ্যাক্সেস-এর সাথে কাজ করে।

ওয়েবক্যাম ফিড হোস্টে স্ট্রিম করা হয়েছে

চিত্র ১। একটি হোস্টে ওয়েবক্যাম ফিড স্ট্রিম করা হচ্ছে, যেখানে প্রিভিউয়ের মাধ্যমে ফিডটি নিয়ন্ত্রণ করা হচ্ছে।

স্থাপত্য

একটি ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহারের জন্য প্রয়োজনীয় আর্কিটেকচারটি চিত্র ২-এ দেখানো হয়েছে। নিচে অ্যান্ড্রয়েড ফ্রেমওয়ার্কের বাকি অংশের সাথে DeviceAsWebcam সার্ভিসটির ইন্টারঅ্যাকশন ফ্লো বর্ণনা করা হলো:

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

ওয়েবক্যাম আর্কিটেকচার হিসেবে ডিভাইস

চিত্র ২. ডিভাইস অ্যাজ ওয়েবক্যাম আর্কিটেকচার।

বাস্তবায়ন

এই অংশে বর্ণনা করা হয়েছে কীভাবে একটি অ্যান্ড্রয়েড ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহার করা যায়।

কার্নেল সমর্থন

অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণগুলিতে, জেনেরিক কার্নেল ইমেজ (GKI) ডিফল্টরূপে UVC গ্যাজেট ড্রাইভারটি সক্রিয় করে (বিস্তারিত জানতে AOSP প্যাচ দেখুন)।

গ্যাজেট HAL-এ UVC সমর্থন করুন

অ্যান্ড্রয়েড ১৪ থেকে, UVC ফাংশনটি GadgetFunction.aidl HAL ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে। Gadget HAL-এর জন্য, UVC গ্যাজেটটি MTP বা ADB-এর মতো অন্যান্য ConfigFS ফাংশনের মতোই ConfigFS-এ মাউন্ট করা হয়।

গ্যাজেট এইচএএল (Gadget HAL) বাস্তবায়ন করতে, কনফিগএফএস (ConfigFS)-এ ইউভিসি (UVC) ফাংশনটি মাউন্ট করার জন্য পরিবর্তনসমূহ করুন। নিচে ইউভিসি (UVC) ফাংশন সমর্থনকারী একটি গ্যাজেট এইচএএল (Gadget 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 লজিক ভেন্ডর ইনিট অথবা DeviceAsWebcam সার্ভিসে থাকে, তাই গ্যাজেট এইচএএল-এ UVC ফাংশনটিকে কনফিগএফএস-এ সিমলিঙ্ক করা ছাড়া অন্য কোনো UVC-নির্দিষ্ট লজিকের প্রয়োজন হয় না।

বাস্তবায়ন সংক্রান্ত আরও নির্দেশনার জন্য, AOSP-তে নিম্নলিখিত নমুনা কোডটি দেখুন:

UVC কনফিগারেশন দিয়ে ConfigFS সেট আপ করুন

অ্যান্ড্রয়েড ওয়েবক্যাম কোন কোন ফরম্যাট, সাইজ এবং ফ্রেম রেট সমর্থন করে, তা UVC গ্যাজেট ড্রাইভারকে জানানোর জন্য, UVC কনফিগারেশন দিয়ে ConfigFS সেট আপ করুন। আরও তথ্যের জন্য, ConfigFS UVC গ্যাজেট ABI সম্পর্কিত আপস্ট্রিম লিনাক্স ডকুমেন্টেশন দেখুন।

নিম্নলিখিতটি হল একটি উদাহরণ যেখানে দেখানো হয়েছে কিভাবে 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 গ্যাজেট ড্রাইভারকে প্রতি সেকেন্ডে ৩০ ফ্রেম হারে একটি 1080p MJPEG স্ট্রিম প্রচারের জন্য প্রস্তুত করে। যখন USB হোস্ট সমর্থিত রেজোলিউশন এবং ফ্রেম রেট সম্পর্কে জানতে চায়, তখন এই সক্ষমতাগুলো তাকে জানানো হয়।

ওয়েবক্যাম যে কনফিগারেশনগুলো প্রদর্শন করে, সেগুলো নির্বাচন করার জন্য নিম্নলিখিতগুলো সাধারণ নির্দেশিকা:

  • DeviceAsWebcam পরিষেবাটি দুটি স্ট্রিম ফরম্যাট সমর্থন করে: MJPEG এবং অসংকুচিত YUYV।
  • ইউএসবি ২.০ ৪৮০ এমবিপিএস (৬০ এমবিপিএস) গতিতে ডেটা ট্রান্সফার সমর্থন করে। এর মানে হলো, ৩০ এফপিএস-এ প্রতিটি ফ্রেমের সর্বোচ্চ আকার অবশ্যই ২ এমবি হতে হবে; এবং ৬০ এফপিএস-এ সর্বোচ্চ আকার হবে ১ এমবি।
    • অসংকুচিত স্ট্রিম (YUYV): ৩০ এফপিএস-এ, সর্বোচ্চ সমর্থিত ফ্রেম সাইজ হলো ৭২০পি, কারণ YUYV-এর প্রতি পিক্সেল ২ বাইট।
    • সংকুচিত 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) ফ্রেম সাইজগুলো বিজ্ঞাপিত করার পরামর্শ দিই, কারণ এই সাইজগুলো হোস্ট অ্যাপগুলোতে সাধারণত ব্যবহৃত হয়।
  • প্রধান সামনের ও পেছনের ক্যামেরা ডিভাইসগুলোকে অবশ্যই বিজ্ঞাপিত সকল ফ্রেম রেট সমর্থন করতে হবে। আমরা বিক্রেতাদের ৩০ এফপিএস (fps) সমর্থন করার জন্য দৃঢ়ভাবে সুপারিশ করছি।

ওয়েবক্যাম স্ট্রিম কনফিগারেশন (ConfigFS) যোগ করার একটি উদাহরণের জন্য, AOSP স্যাম্পল প্যাচটি দেখুন।

বিল্ডে ওয়েবক্যাম সক্রিয় করুন

DeviceAsWebcam সার্ভিসটি সক্রিয় করতে, আপনাকে device.mk ফাইলে ro.usb.uvc.enabled সিস্টেম প্রপার্টিটির মান true সেট করতে হবে।

# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
    ro.usb.uvc.enabled=true

যখন এই সিস্টেম প্রপার্টিটি সক্রিয় করা হয়, তখন সেটিংস অ্যাপের ইউএসবি প্রেফারেন্সের অধীনে একটি ওয়েবক্যাম অপশন দেখা যায়, যেমনটি চিত্র ৩-এ দেখানো হয়েছে। অপশনটি নির্বাচন করা হলে, অ্যান্ড্রয়েড ডিভাইসটি হোস্ট ডিভাইসের কাছে একটি ইউএসবি ওয়েবক্যাম হিসাবে প্রদর্শিত হয়।

সেটিংস অ্যাপে ইউএসবি পছন্দসমূহ

চিত্র ৩. সেটিংস অ্যাপে ইউএসবি পছন্দসমূহ।

এছাড়াও আপনি এই কমান্ডটি ব্যবহার করে 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 দেখুন।

    নিম্নলিখিতটি লজিক্যাল ক্যামেরা আইডি ০-এর পরিবর্তে ফিজিক্যাল ক্যামেরা আইডি ৩ ব্যবহার করার জন্য সেট আপ করা একটি RRO-এর উদাহরণ। AOSP-তে একটি উদাহরণের জন্য, DeviceAsWebcamRaven দেখুন।

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

যাচাইকরণ

আপনার ডিভাইসে DeviceAsWebcam সার্ভিসটির বাস্তবায়ন পরীক্ষা করতে, নিম্নলিখিত পরীক্ষাগুলো ব্যবহার করুন:

  • CTS ভেরিফায়ার টেস্ট ওয়েবক্যাম : ডিভাইসটি ফরম্যাট, সাইজ এবং ফ্রেম রেট সমর্থন করে কিনা তা পরীক্ষা করুন।
  • ম্যানুয়াল পরীক্ষা: বিভিন্ন হোস্ট অপারেটিং সিস্টেমে বিভিন্ন হোস্ট অ্যাপের সাথে ওয়েবক্যাম ফিচারটি কাজ করে কিনা তা পরীক্ষা করুন।

পরিচিত সমস্যা

DeviceAsWebcam পরিষেবাটির ক্ষেত্রে নিম্নলিখিত সমস্যাগুলো জানা গেছে: