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

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

DeviceAsWebcam सेवा

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

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

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

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

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

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

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

भवन निर्माण

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

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

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

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

लागू करना

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

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

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

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

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

गैजेट HAL लागू करने के लिए, 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
       ...
   }
   ...
}

जब डिवाइस वेबकैम के रूप में काम कर रहा हो, तो पक्का करें कि USB गैजेट HAL विज्ञापन कर रहा है वीआईडी/पीआईडी के सही कॉम्बिनेशन इस्तेमाल करें.

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

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

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

UVC गैजेट ड्राइवर को सूचित करने के लिए कौन-से प्रारूप, आकार, और फ़्रेम रेट हैं जो Android वेबकैम की मदद से काम करता है, तो यूवीसी कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करें. इसके लिए ज़्यादा जानकारी के लिए, ConfigFS UVC पर अपस्ट्रीम 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 गैजेट ड्राइवर को 1080p MJPEG स्ट्रीम का विज्ञापन करने के लिए सेट करता है: 30 एफ़पीएस (फ़्रेम प्रति सेकंड). जब यूएसबी होस्ट क्वेरी करता है, तब इन क्षमताओं की जानकारी यूएसबी होस्ट को दी जाती है रिज़ॉल्यूशन और फ़्रेम रेट के साथ काम करता है.

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

  • DeviceAsWebcam सेवा के साथ काम करने वाले दो स्ट्रीम फ़ॉर्मैट हैं: MJPEG और बिना कंप्रेस की गई YUYV.
  • यूएसबी 2.0, 480 एमबीपीएस (60 एमबीपीएस) पर डेटा ट्रांसफ़र कर सकती है. यह इसका मतलब है कि 30 फ़्रेम प्रति सेकंड पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए; और 60 एफ़पीएस (फ़्रेम प्रति सेकंड) पर, ज़्यादा से ज़्यादा 1 एमबी तक होना चाहिए.
    • बिना कंप्रेस की गई स्ट्रीम (YUYV): 30 FPS (फ़्रेम प्रति सेकंड) पर, ज़्यादा से ज़्यादा इतने फ़्रेम के साथ काम किया जा सकता है साइज़ 720p है, क्योंकि YUYV हर पिक्सल में 2 बाइट होता है.
    • कंप्रेस की गई 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 सेवा चालू करने के लिए, आपको ro.usb.uvc.enabled को सेट करना होगा device.mk फ़ाइल में सिस्टम प्रॉपर्टी को true करने के लिए.

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

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

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

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

adb shell svc usb setFunctions uvc

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

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

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

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

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

पुष्टि करना

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

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

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

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