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

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

DeviceAsWebcam सेवा

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

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

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

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

झलक से जुड़ी गतिविधि, Android पर TalkBack, स्विच ऐक्सेस, और वॉइस ऐक्सेस जैसी सामान्य सुलभता सुविधाओं के साथ काम करती है.

वेबकैम फ़ीड को होस्ट पर स्ट्रीम किया गया

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

भवन निर्माण

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

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

वेबकैम आर्किटेक्चर के तौर पर डिवाइस

दूसरा डायग्राम. DeviceAsWebcam आर्किटेक्चर.

लागू करने का तरीका

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

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

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

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

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

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

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

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

सभी यूवीसी लॉजिक, वेंडर इनिट या DeviceAsWebcam सेवा में होते हैं. इसलिए, गैजेट एचएएल में यूवीसी फ़ंक्शन को ConfigFS से लिंक करने के अलावा, किसी भी यूवीसी खास लॉजिक की ज़रूरत नहीं होती.

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

यूवीसी कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करें

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

यहां दिए गए उदाहरण में बताया गया है कि वेंडर init, यूवीसी गैजेट ड्राइवर (एओएसपी में कोड स्निपेट) को कैसे सेट अप कर सकता है:

# 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 स्ट्रीम का विज्ञापन दिखाया जा सके. जब यूएसबी होस्ट, काम करने वाले रिज़ॉल्यूशन और फ़्रेम रेट के बारे में क्वेरी करता है, तब इन क्षमताओं की जानकारी यूएसबी होस्ट को दी जाती है.

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

  • DeviceAsWebcam सेवा के साथ काम करने वाले दो स्ट्रीम फ़ॉर्मैट हैं, MJPEG और अनकंप्रेस की गई YUYV.
  • यूएसबी 2.0, 480 एमबीपीएस (60 एमबीपीएस) पर डेटा ट्रांसफ़र कर सकती है. इसका मतलब है कि 30 FPS (फ़्रेम प्रति सेकंड) पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए. साथ ही, 60 FPS (फ़्रेम प्रति सेकंड) पर, ज़्यादा से ज़्यादा एक एमबी होना चाहिए.
    • बिना कंप्रेस की गई स्ट्रीम (YUYV): 30 FPS (फ़्रेम प्रति सेकंड) पर काम करने वाले फ़्रेम का ज़्यादा से ज़्यादा साइज़ 720p है, क्योंकि YUYV का साइज़ हर पिक्सल में दो बाइट होता है.
    • कंप्रेस की गई MJPEG स्ट्रीम: YUV से 1:10 संपीड़न अनुपात मानकर, यूएसबी 2.0 4K (हर फ़्रेम के लिए 1.18 एमबी) पर काम कर सकता है.
  • सामने और पीछे वाले मुख्य कैमरे वाले डिवाइस में, विज्ञापन में दिखाए जा रहे सभी फ़्रेम साइज़ काम करने चाहिए. ऐसा इसलिए है, क्योंकि उपयोगकर्ता झलक दिखाने वाले यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, कैमरा आईडी के बीच स्विच कर सकता है. MJPEG स्ट्रीम के लिए, हम वेंडर को 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

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

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

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

adb shell svc usb setFunctions uvc

ऊर्जा और थर्मल से जुड़ी समस्याओं को हल करें

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

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

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

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

पुष्टि करें

यह जानने के लिए कि आपके डिवाइस पर DeviceAsWebcam सेवा लागू है या नहीं, ये टेस्ट करें:

  • सीटीएस की पुष्टि करने वाला टेस्ट वेबकैम: जांच लें कि डिवाइस पर फ़ॉर्मैट, साइज़, और फ़्रेम रेट काम करते हैं या नहीं.
  • मैन्युअल तरीके से जांच करना: यह जांच लें कि वेबकैम की सुविधा, अलग-अलग होस्ट ऑपरेटिंग सिस्टम पर मौजूद कई तरह के होस्ट ऐप्लिकेशन के साथ काम करती है.

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

DeviceAsWebcam सेवा से जुड़ी आम समस्याएं: