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

Android 14 QPR1 বা এর পরবর্তী যেকোনও ভার্সনে চলা ডিভাইসের ক্ষেত্রে, Android USB ওয়েবক্যাম হিসেবে ডিভাইস ব্যবহার করার সুবিধা দেয়। এই ফিচার কাজ করে এমন Android ডিভাইসকে UVC ডিভাইস হিসেবে বিজ্ঞাপন দেওয়া হয়, যা বিভিন্ন অপারেটিং সিস্টেম (যেমন, Linux, macOS, Windows এবং ChromeOS) সহ USB হোস্টের একটি বিস্তৃত রেঞ্জকে ডিভাইসের ক্যামেরাকে ওয়েবক্যাম হিসেবে ব্যবহার করতে দেয়। DeviceAsWebcam পরিষেবা ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহার করার জন্য এই ফিচারকে সাপোর্ট করে।

DeviceAsWebcam পরিষেবা

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

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

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

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

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

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

ছবি ১. ওয়েবক্যাম ফিড হোস্টকে স্ট্রিম করা হচ্ছে এবং প্রিভিউ কন্ট্রোল ফিডকে কন্ট্রোল করছে।

স্থাপত্যশিল্প

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

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

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

ছবি ২. DeviceAsWebcam আর্কিটেকচার।

প্রয়োগ

এই বিভাগে Android ডিভাইসকে ওয়েবক্যাম হিসেবে ব্যবহার করার সুবিধা কীভাবে দেওয়া যায় তা বর্ণনা করা হয়েছে।

কার্নেল সংক্রান্ত সহায়তা

Android 14 বা তার পরের যেকোনও ভার্সনের জন্য, জেনেরিক কার্নেল ইমেজ (GKI) ডিফল্ট হিসেবে UVC গ্যাজেট ড্রাইভার চালু করে (AOSP প্যাচ-এ বিবরণ দেখুন)।

Gadget HAL-এ UVC কাজ করে

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

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

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

UVC কনফিগারেশনের সাথে ConfigFS সেট-আপ করুন

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

ভেন্ডর 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 গ্যাজেট ড্রাইভারকে 30 fps-এ 1080p MJPEG স্ট্রিম বিজ্ঞাপন দেওয়ার জন্য সেট-আপ করে। এইসব ক্ষমতা USB হোস্টকে জানানো হয় যখন এটি কাজ করে সমর্থিত রেজোলিউশন এবং ফ্রেম রেট।

ওয়েবক্যাম বিজ্ঞাপন দেয় এমন কনফিগারেশন বেছে নেওয়ার জন্য নিম্নলিখিত সাধারণ নির্দেশিকা দেওয়া হল:

  • DeviceAsWebcam পরিষেবাতে কাজ করে এমন দুটি স্ট্রিম ফর্ম্যাট হল MJPEG এবং আনকমপ্রেসড YUYV।
  • USB 2.0, 480 Mbps (60 MBps) ডেটা ট্রান্সফার করতে পারে। এর অর্থ হল, ৩০ fps-এ প্রতিটি ফ্রেমের সর্বাধিক সাইজ ২ এমবি হতে হবে; এবং ৬০ fps-এ সর্বাধিক সাইজ ১ এমবি হতে হবে।
    • কমপ্রেস না করা স্ট্রিম (YUYV): ৩০ fps-এ, সর্বাধিক কাজ করে এমন ফ্রেম সাইজ হল ৭২০p কারণ YUYV হল পিক্সেল পিছু ২ বাইট।
    • কম্প্রেস করা MJPEG স্ট্রিম: YUV থেকে ১:১০ কম্প্রেশন অনুপাত ধরে নিয়ে, USB ২.০ 4K (ফ্রেম প্রতি ১.১৮ এমবি) সাপোর্ট করতে পারে।
  • বিজ্ঞাপন দেওয়া সব ফ্রেম সাইজ অবশ্যই প্রাইমারি ফ্রন্ট ও ব্যাক ক্যামেরা ডিভাইসে কাজ করতে হবে। এর কারণ হল, ব্যবহারকারী প্রিভিউ UI ব্যবহার করে ক্যামেরা আইডির মধ্যে পরিবর্তন করতে পারেন। MJPEG স্ট্রিমের জন্য, আমরা সাজেস্ট করি যে ভেন্ডররা ৪৮০p (৬৪০ x ৪৮০), ৭২০p (১২৮০ x ৮২০) এবং ১০৮০p (১৯২০ x ১০৮০) ফ্রেম সাইজের বিজ্ঞাপন দিন কারণ এগুলি হল হোস্ট অ্যাপের দ্বারা সাধারণত ব্যবহৃত সাইজ।
  • বিজ্ঞাপন দেওয়া সব ফ্রেম রেট অবশ্যই প্রাইমারি ফ্রন্ট ও ব্যাক ক্যামেরা ডিভাইসে কাজ করতে হবে। আমরা বিশেষভাবে সাজেস্ট করি যে ভেন্ডররা যেন ৩০ fps-এ কাজ করে।

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

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

DeviceAsWebcam পরিষেবা চালু করতে, আপনাকে অবশ্যই ro.usb.uvc.enabled সিস্টেম প্রপার্টি true-এ device.mk ফাইলে সেট করতে হবে।

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

এই সিস্টেম প্রপার্টি চালু করা হলে, USB প্রেফারেন্সের অধীনে সেটিংস অ্যাপে ওয়েবক্যাম বিকল্প দেখা যায়, যেমনটি ছবি ৩-এ দেখানো হয়েছে। এই বিকল্পটি বেছে নেওয়া হলে, Android ডিভাইসটি হোস্ট ডিভাইসের কাছে 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 পরিষেবার ক্ষেত্রে নিম্নলিখিত সমস্যাগুলি জানা আছে: