किसी डिवाइस को वेबकैम के तौर पर इस्तेमाल करना

Android 14 QPR1 या इसके बाद के वर्शन वाले डिवाइसों के लिए, Android में डिवाइस को यूएसबी वेबकैम के तौर पर इस्तेमाल करने की सुविधा उपलब्ध है. इस सुविधा के साथ काम करने वाले Android डिवाइसों को यूवीसी डिवाइस के तौर पर विज्ञापन दिया जाता है. इससे अलग-अलग ऑपरेटिंग सिस्टम (जैसे, Linux, macOS, Windows, और ChromeOS) वाले कई यूएसबी होस्ट, डिवाइस के कैमरे को वेबकैम के तौर पर इस्तेमाल कर सकते हैं. DeviceAsWebcam सेवा, डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की सुविधा देती है.

DeviceAsWebcam सेवा

AOSP में मौजूद DeviceAsWebcam सेवा में, झलक दिखाने वाली गतिविधि (DeviceAsWebcamPreview.java) शामिल होती है. इसकी मदद से, उपयोगकर्ता सीन को फ़्रेम कर सकते हैं. झलक देखने की सुविधा से, उपयोगकर्ता ये काम कर सकता है:

  • स्ट्रीमिंग शुरू होने से पहले, यह देखें कि होस्ट मशीन पर वेबकैम फ़ीड कैसा दिखेगा.

  • होस्ट को भेजे जाने वाले वेबकैम फ़ीड को इन तरीकों से पसंद के मुताबिक बनाएं:

    • स्ट्रीम करने के लिए, फ़्रंट या बैक कैमरा चुनना.
    • स्लाइडर या बटन का इस्तेमाल करके, ज़ूम लेवल चुनना.
    • किसी क्षेत्र पर फ़ोकस करने या फ़ोकस हटाने के लिए, झलक के किसी हिस्से पर टैप करना.

प्रीव्यू ऐक्टिविटी, Android पर उपलब्ध सामान्य ऐक्सेसिबिलिटी सुविधाओं के साथ काम करती है. जैसे, TalkBack, ऐक्सेस करने का तरीका बदलें, और बोलकर फ़ोन इस्तेमाल करने की सुविधा.

वेबकैम फ़ीड को होस्ट करने वाले व्यक्ति के साथ शेयर किया गया हो

पहली इमेज. वेबकैम फ़ीड को किसी होस्ट को स्ट्रीम किया जा रहा है. होस्ट के पास फ़ीड को कंट्रोल करने का विकल्प है.

भवन निर्माण

किसी डिवाइस को वेबकैम के तौर पर इस्तेमाल करने के लिए, आर्किटेक्चर को इमेज 2 में दिखाया गया है. यहां बताया गया है कि DeviceAsWebcam सेवा, Android फ़्रेमवर्क के बाकी हिस्सों के साथ कैसे इंटरैक्ट करती है:

  1. इस इमेज में दिखाया गया है कि उपयोगकर्ता, सेटिंग ऐप्लिकेशन में यूएसबी वेबकैम का विकल्प चुनता है.
  2. सेटिंग ऐप्लिकेशन, UsbManager क्लास के ज़रिए system_server को बाइंडर कॉल भेजता है. इससे system_server को यह सूचना मिलती है कि FUNCTION_UVC को चुना गया है.
  3. सिस्टम सर्वर ये काम करता है:
    1. यह यूएसबी गैजेट एचएएल को, setUsbFunctions एचएएल इंटरफ़ेस कॉल के ज़रिए यूवीसी गैजेट फ़ंक्शन को वापस पाने के लिए सूचना देता है.
    2. यह यूएसबी गैजेट एचएएल को, ConfigFs का इस्तेमाल करके UVC गैजेट ड्राइवर को कॉन्फ़िगर करने के बारे में सूचना देता है.
  4. गैजेट HAL से कॉलबैक मिलने पर, system_server फ़्रेमवर्क को एक ब्रॉडकास्ट भेजता है, ताकि DeviceAsWebcam सेवा उसे पिक अप कर सके.
  5. यूएसबी गैजेट ड्राइवर, /dev/video* पर V4L2 नोड के ज़रिए होस्ट से कॉन्फ़िगरेशन कमांड मिलने पर, वेबकैम स्ट्रीम शुरू करता है.

वेबकैम के तौर पर डिवाइस इस्तेमाल करने की सुविधा का आर्किटेक्चर

दूसरी इमेज. DeviceAsWebcam का आर्किटेक्चर.

लागू करना

इस सेक्शन में, Android डिवाइस को वेबकैम के तौर पर इस्तेमाल करने की सुविधा के बारे में बताया गया है.

कर्नेल सपोर्ट

Android 14 या इसके बाद के वर्शन के लिए, जेनेरिक कर्नेल इमेज (जीकेआई), यूवीसी गैजेट ड्राइवर को डिफ़ॉल्ट रूप से चालू करती है. ज़्यादा जानकारी के लिए, AOSP पैच देखें.

गैजेट एचएएल में यूवीसी की सुविधा काम करती है

Android 14 से, यूवीसी फ़ंक्शन को GadgetFunction.aidl एचएएल इंटरफ़ेस में शामिल किया गया है. गैजेट एचएएल के लिए, यूवीसी गैजेट को ConfigFS में उसी तरह से माउंट किया जाता है जिस तरह से MTP या ADB जैसे अन्य ConfigFS फ़ंक्शन को माउंट किया जाता है.

गैजेट एचएएल को लागू करने के लिए, UVC फ़ंक्शन को ConfigFS पर माउंट करने के लिए बदलाव करें. यहां गैजेट एचएएल को लागू करने का एक उदाहरण दिया गया है. यह यूवीसी फ़ंक्शन के साथ काम करता है:

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
       ...
   }
   ...
}

जब डिवाइस को वेबकैम के तौर पर इस्तेमाल किया जा रहा हो, तब पक्का करें कि यूएसबी गैजेट HAL, सही VID/PID कॉम्बिनेशन का विज्ञापन दिखा रहा हो.

यूवीसी का पूरा लॉजिक, वेंडर init या DeviceAsWebcam service में होता है. इसलिए, Gadget HAL में यूवीसी से जुड़ा कोई लॉजिक ज़रूरी नहीं होता. हालांकि, UVC फ़ंक्शन को ConfigFS से सिमलंक करने के लिए, Gadget HAL में लॉजिक की ज़रूरत होती है.

इसे लागू करने के बारे में ज़्यादा जानने के लिए, AOSP में मौजूद यह सैंपल कोड देखें:

UVC कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करना

यूवीसी गैजेट ड्राइवर को यह बताने के लिए कि Android वेबकैम किन फ़ॉर्मैट, साइज़, और फ़्रेम रेट के साथ काम करता है, यूवीसी कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करें. ज़्यादा जानकारी के लिए, ConfigFS UVC गैजेट ABI के बारे में Linux का अपस्ट्रीम दस्तावेज़ देखें.

यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि वेंडर init, यूवीसी गैजेट ड्राइवर को कैसे सेट अप कर सकता है (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 फ़्रेम प्रति सेकंड (एफ़पीएस) पर 1080p MJPEG स्ट्रीम का विज्ञापन दिखाने के लिए, यूवीसी गैजेट ड्राइवर सेट अप करता है. जब यूएसबी होस्ट, काम करने वाले रिज़ॉल्यूशन और फ़्रेम रेट के बारे में क्वेरी करता है, तब इन सुविधाओं के बारे में उसे बताया जाता है.

वेबकैम के कॉन्फ़िगरेशन चुनने के लिए, यहां सामान्य दिशा-निर्देश दिए गए हैं:

  • DeviceAsWebcam सेवा के साथ काम करने वाले दो स्ट्रीम फ़ॉर्मैट, MJPEG और अनकंप्रेस किया गया YUYV हैं.
  • यूएसबी 2.0, 480 एमबीपीएस (60 एमबीपीएस) की रफ़्तार से डेटा ट्रांसफ़र करने की सुविधा देता है. इसका मतलब है कि 30 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए. वहीं, 60 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 1 एमबी होना चाहिए.
    • बिना कंप्रेस की गई स्ट्रीम (YUYV): 30 फ़्रेम प्रति सेकंड पर, ज़्यादा से ज़्यादा 720 पिक्सल के फ़्रेम साइज़ का इस्तेमाल किया जा सकता है. ऐसा इसलिए, क्योंकि YUYV में हर पिक्सल के लिए 2 बाइट होते हैं.
    • कंप्रेस की गई MJPEG स्ट्रीम: मान लें कि YUV से कंप्रेस करने का अनुपात 1:10 है. ऐसे में, USB 2.0, 4K (हर फ़्रेम के लिए 1.18 MB) को सपोर्ट कर सकता है.
  • सामने और पीछे के मुख्य कैमरे वाले डिवाइसों में, विज्ञापन में बताए गए सभी फ़्रेम साइज़ काम करने चाहिए. ऐसा इसलिए होता है, क्योंकि उपयोगकर्ता, झलक दिखाने वाले यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, कैमरा आईडी के बीच स्विच कर सकता है. एमजेपीईजी स्ट्रीम के लिए, हमारा सुझाव है कि वेंडर 480 पिक्सल (640 x 480), 720 पिक्सल (1280 x 820), और 1080 पिक्सल (1920 x 1080) फ़्रेम साइज़ के विज्ञापन दिखाएं. ऐसा इसलिए, क्योंकि होस्ट ऐप्लिकेशन आम तौर पर इन्हीं साइज़ का इस्तेमाल करते हैं.
  • सामने और पीछे के मुख्य कैमरे वाले डिवाइसों में, विज्ञापन में बताए गए सभी फ़्रेम रेट काम करने चाहिए. हमारा सुझाव है कि वेंडर, 30 फ़्रेम प्रति सेकंड (एफ़पीएस) की सुविधा दें.

वेबकैम स्ट्रीम कॉन्फ़िगरेशन (ConfigFS) जोड़ने के उदाहरण के लिए, AOSP का सैंपल पैच देखें.

बिल्ड में वेबकैम चालू करना

DeviceAsWebcam सेवा चालू करने के लिए, आपको device.mk फ़ाइल में ro.usb.uvc.enabled सिस्टम प्रॉपर्टी को true पर सेट करना होगा.

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

इस सिस्टम प्रॉपर्टी के चालू होने पर, वेबकैम का विकल्प, USB की सेटिंग में जाकर सेटिंग ऐप्लिकेशन में दिखता है. इसे तीसरे फ़िगर में दिखाया गया है. इस विकल्प को चुनने पर, Android डिवाइस, होस्ट डिवाइस को यूएसबी वेबकैम के तौर पर दिखता है.

सेटिंग ऐप्लिकेशन में यूएसबी प्राथमिकताएं

तीसरी इमेज. सेटिंग ऐप्लिकेशन में यूएसबी की प्राथमिकताएं.

इस कमांड का इस्तेमाल करके, डिवाइस को यूएसबी वेबकैम फ़ंक्शन पर भी सेट किया जा सकता है:

adb shell svc usb setFunctions uvc

पावर और तापमान से जुड़ी समस्याओं को ध्यान में रखना

वेबकैम का इस्तेमाल करने का मतलब है कि डिवाइस का कैमरा, दिन में कई घंटों तक चालू रह सकता है. इसलिए, हमारा सुझाव है कि आप ऐसे तरीके अपनाएं जिनसे यह पक्का किया जा सके कि डिवाइस की बैटरी की खपत और तापमान, तय सीमा के अंदर रहे. पावर की खपत को तय सीमा के अंदर रखने के लिए, यहां दिए गए सुझावों को आज़माएं:

  • कैमरा एचएएल की बेहतर परफ़ॉर्मेंस के लिए, STREAM_USE_CASE_VIDEO_CALL सेवा में DeviceAsWebcam चालू करें.
  • अगर STREAM_USE_CASE_VIDEO_CALL की सुविधा चालू होने के बाद भी, बैटरी की खपत कम नहीं हो रही है, तो DeviceAsWebcam सेवा में बैटरी की खपत को और कम करने का विकल्प मिलता है. इसके लिए, फ़िज़िकल स्ट्रीम का इस्तेमाल किया जाता है. रनटाइम रिसॉर्स ओवरले (आरआरओ) का इस्तेमाल करके, यह तय किया जा सकता है कि किस फ़िज़िकल कैमरे का इस्तेमाल करना है. फ़िज़िकल स्ट्रीम से वीडियो की क्वालिटी काफ़ी कम हो जाती है और इससे यूज़र एक्सपीरियंस (यूएक्स) खराब होता है. इसलिए, इस समाधान का इस्तेमाल सिर्फ़ आखिरी विकल्प के तौर पर करें. STREAM_USE_CASE_VIDEO_CALL को ऑप्टिमाइज़ करना, बैटरी से जुड़ी समस्याओं का सबसे अच्छा समाधान है. DeviceAsWebcam सेवा के साथ काम करने वाले RRO के बारे में ज़्यादा जानने के लिए, readme.md देखें.

    यहां एक ऐसे RRO का उदाहरण दिया गया है जिसे लॉजिकल कैमरा आईडी 0 के बजाय फ़िज़िकल कैमरा आईडी 3 का इस्तेमाल करने के लिए सेट अप किया गया है. AOSP में उदाहरण के लिए, DeviceAsWebcamRaven देखें.

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

पुष्टि

अपने डिवाइस पर DeviceAsWebcam सेवा को लागू करने की जांच करने के लिए, यहां दिए गए टेस्ट का इस्तेमाल करें:

  • CTS verifier test वेबकैम: यह टेस्ट करता है कि डिवाइस पर फ़ॉर्मैट, साइज़, और फ़्रेम रेट काम करते हैं या नहीं.
  • मैन्युअल टेस्ट: यह टेस्ट करें कि वेबकैम की सुविधा, अलग-अलग होस्ट ऐप्लिकेशन और होस्ट ऑपरेटिंग सिस्टम पर काम करती है या नहीं.

पहले से मालूम समस्याएं

DeviceAsWebcam सेवा से जुड़ी ये समस्याएं आम तौर पर होती हैं: