Android 14-QPR1 या इसके बाद के वर्शन वाले डिवाइसों के लिए, Android पर डिवाइस को यूएसबी वेबकैम के तौर पर इस्तेमाल करने की सुविधा उपलब्ध है. इस सुविधा वाले Android डिवाइसों को UVC डिवाइस के तौर पर दिखाया जाता है. इससे, अलग-अलग ऑपरेटिंग सिस्टम (उदाहरण के लिए, Linux, macOS, Windows, और ChromeOS) वाले यूएसबी होस्ट, डिवाइस के कैमरे को वेबकैम के तौर पर इस्तेमाल कर सकते हैं. DeviceAsWebcam
सेवा, डिवाइस को वेबकैम के तौर पर इस्तेमाल करने के लिए, इस सुविधा के साथ काम करती है.
DeviceAsWebcam सेवा
AOSP में DeviceAsWebcam
सेवा में झलक वाली गतिविधि (DeviceAsWebcamPreview.java
) शामिल होती है. इसकी मदद से, उपयोगकर्ता सीन को फ़्रेम कर सकते हैं. झलक देखने की गतिविधि की मदद से, उपयोगकर्ता ये काम कर सकता है:
स्ट्रीमिंग शुरू होने से पहले, देखें कि वेबकैम फ़ीड, होस्ट मशीन पर कैसा दिखेगा.
होस्ट को भेजे गए वेबकैम फ़ीड को इन तरीकों से पसंद के मुताबिक बनाया जा सकता है:
- स्ट्रीम करने के लिए, सामने या पीछे वाला कैमरा चुनना.
- स्लाइडर या बटन का इस्तेमाल करके, ज़ूम लेवल चुनना.
- किसी हिस्से पर फ़ोकस करने या फ़ोकस हटाने के लिए, झलक में उस हिस्से पर टैप करना.
झलक देखने की सुविधा, Android पर सुलभता से जुड़ी सामान्य सुविधाओं के साथ काम करती है. जैसे, TalkBack, ऐक्सेस करने का तरीका बदलें, और बोलकर फ़ोन इस्तेमाल करने की सुविधा.
पहली इमेज. वेबकैम फ़ीड को होस्ट को स्ट्रीम किया जा रहा है. फ़ीड को कंट्रोल करने के लिए, झलक का इस्तेमाल किया जा रहा है.
भवन निर्माण
किसी डिवाइस को वेबकैम के तौर पर इस्तेमाल करने के लिए, आर्किटेक्चर की जानकारी दूसरी इमेज में दी गई है. यहां Android फ़्रेमवर्क के बाकी हिस्सों के साथ, DeviceAsWebcam
सेवा के इंटरैक्शन फ़्लो के बारे में बताया गया है:
- उपयोगकर्ता, Settings ऐप्लिकेशन में यूएसबी वेबकैम का विकल्प चुनता है.
- सेटिंग ऐप्लिकेशन,
UsbManager
क्लास के ज़रिएsystem_server
को एक बाइंडर कॉल भेजता है. इससेFUNCTION_UVC
को चुने जाने की जानकारी मिलती है. - सिस्टम सर्वर ये काम करता है:
setUsbFunctions
HAL इंटरफ़ेस कॉल के ज़रिए, यूएसबी गैजेट के एचएएल को UVC गैजेट फ़ंक्शन को वापस पाने के लिए सूचना देता है.- यूएसबी गैजेट एचएएल को ConfigFs का इस्तेमाल करके, यूवीसी गैजेट ड्राइवर को कॉन्फ़िगर करने के लिए सूचना देता है.
- गैजेट HAL से कॉलबैक मिलने के बाद,
system_server
फ़्रेमवर्क पर एक ब्रॉडकास्ट भेजता है, ताकिDeviceAsWebcam
सेवा उसे पिक अप कर सके. - यूएसबी गैजेट ड्राइवर,
/dev/video*
पर V4L2 नोड के ज़रिए होस्ट से कॉन्फ़िगरेशन कमांड मिलने पर वेबकैम स्ट्रीम शुरू करता है.
दूसरी इमेज. DeviceAsWebcam आर्किटेक्चर.
लागू करना
इस सेक्शन में, Android डिवाइस को वेबकैम के तौर पर इस्तेमाल करने का तरीका बताया गया है.
कर्नेल से जुड़ी सहायता
Android 14 या इसके बाद के वर्शन के लिए, जनरिक कर्नेल इमेज (GKI) डिफ़ॉल्ट रूप से यूवीसी गैजेट ड्राइवर चालू करता है. ज़्यादा जानकारी के लिए, AOSP पैच देखें.
Gadget HAL में यूवीसी की सुविधा
Android 14 से, UVC फ़ंक्शन को GadgetFunction.aidl
एचएएल इंटरफ़ेस में शामिल किया गया है. Gadget HAL के लिए, UVC डिवाइस को ConfigFS में उसी तरह से माउंट किया जाता है जिस तरह ConfigFS के अन्य फ़ंक्शन, जैसे कि MTP या ADB को माउंट किया जाता है.
Gadget HAL लागू करने के लिए, UVC फ़ंक्शन को ConfigFS पर माउंट करने के लिए बदलाव करें. यहां 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
...
}
...
}
जब डिवाइस वेबकैम के तौर पर काम कर रहा हो, तो पक्का करें कि यूएसबी गैजेट एचएएल, सही VID/PID कॉम्बिनेशन का विज्ञापन कर रहा हो.
यूवीसी का पूरा लॉजिक, वेंडर के init या DeviceAsWebcam
सेवा में होता है. इसलिए, Gadget HAL में यूवीसी फ़ंक्शन को ConfigFS से लिंक करने के अलावा, यूवीसी के लिए कोई खास लॉजिक ज़रूरी नहीं है.
लागू करने के बारे में ज़्यादा जानकारी के लिए, AOSP में दिया गया यह सैंपल कोड देखें:
UVC कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करना
UVC गैजेट ड्राइवर को यह बताने के लिए कि Android वेबकैम किन फ़ॉर्मैट, साइज़, और फ़्रेम रेट के साथ काम करता है, UVC कॉन्फ़िगरेशन के साथ ConfigFS सेट अप करें. ज़्यादा जानकारी के लिए, ConfigFS UVC डिवाइस के एबीआई के बारे में अपस्ट्रीम 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
# ...
यह स्निपेट, UVC गैजेट ड्राइवर को सेट अप करता है, ताकि 30 fps पर 1080p MJPEG स्ट्रीम का विज्ञापन दिखाया जा सके. जब यूएसबी होस्ट, काम करने वाले रिज़ॉल्यूशन और फ़्रेम रेट के बारे में क्वेरी करता है, तब इन सुविधाओं के बारे में उसे सूचना दी जाती है.
वेबकैम के विज्ञापन में दिखाए गए कॉन्फ़िगरेशन चुनने के लिए, यहां सामान्य दिशा-निर्देश दिए गए हैं:
DeviceAsWebcam
सेवा पर, स्ट्रीम के लिए ये दो फ़ॉर्मैट इस्तेमाल किए जा सकते हैं: एमजेपीईजी और बिना कंप्रेस किए गए YUYV.- USB 2.0 की मदद से, 480 एमबीपीएस (60 एमबीपीएस) की रफ़्तार से डेटा ट्रांसफ़र किया जा सकता है. इसका मतलब है कि 30 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 2 एमबी होना चाहिए. साथ ही, 60 एफ़पीएस पर, हर फ़्रेम का साइज़ ज़्यादा से ज़्यादा 1 एमबी होना चाहिए.
- बिना कंप्रेस की गई स्ट्रीम (YUYV): 30 एफ़पीएस पर, ज़्यादा से ज़्यादा 720 पिक्सल का फ़्रेम साइज़ इस्तेमाल किया जा सकता है, क्योंकि YUYV में हर पिक्सल के लिए दो बाइट होते हैं.
- कंप्रेस की गई MJPEG स्ट्रीम: YUV से 1:10 कंप्रेस करने का अनुपात मानते हुए, USB 2.0 पर 4K (हर फ़्रेम के लिए 1.18 एमबी) काम कर सकता है.
- मुख्य सामने और पीछे के कैमरे वाले डिवाइसों में, विज्ञापन में दिखाए गए सभी फ़्रेम साइज़ काम करने चाहिए. ऐसा इसलिए है, क्योंकि उपयोगकर्ता झलक वाले यूज़र इंटरफ़ेस का इस्तेमाल करके, कैमरा आईडी के बीच स्विच कर सकता है. हमारा सुझाव है कि वेंडर, एमजेपीईजी स्ट्रीम के लिए 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
इस सिस्टम प्रॉपर्टी के चालू होने पर, वेबकैम विकल्प, सेटिंग ऐप्लिकेशन में यूएसबी सेटिंग में दिखता है. यह विकल्प, तीसरे चित्र में दिखाया गया है. यह विकल्प चुनने पर, 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 देखें.यहां दिए गए उदाहरण में, लॉजिकल कैमरा आईडी 0 के बजाय फ़िज़िकल कैमरा आईडी 3 का इस्तेमाल करने के लिए, आरआरओ सेट अप किया गया है. AOSP में इसका उदाहरण देखने के लिए, DeviceAsWebcamRaven देखें.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
पुष्टि करें
अपने डिवाइस पर DeviceAsWebcam
सेवा के लागू होने की जांच करने के लिए, इन जांचों का इस्तेमाल करें:
- सीटीएस की पुष्टि करने वाले टूल से वेबकैम की जांच करना: जांचें कि डिवाइस पर फ़ॉर्मैट, साइज़, और फ़्रेम रेट काम करते हैं या नहीं.
- मैन्युअल टेस्ट: जांचें कि वेबकैम की सुविधा, अलग-अलग होस्ट ऑपरेटिंग सिस्टम पर, अलग-अलग होस्ट ऐप्लिकेशन के साथ काम करती है या नहीं.
पहले से मालूम समस्याएं
DeviceAsWebcam
सेवा से जुड़ी ये समस्याएं आम तौर पर होती हैं:
यूवीसी गैजेट ड्राइवर की स्ट्रीम कभी-कभी फ़्लिकर करती है और ऐसा लगता है कि फ़्रेम खराब हो गए हैं. इस समस्या को ठीक कर दिया गया है और इसे अपस्ट्रीम और GKI में मर्ज कर दिया गया है.
अपस्ट्रीम से जुड़ी समस्याएं ठीक करना:
वेबकैम मोड में काम करने वाले Android डिवाइस, macOS होस्ट पर यूएसबी 3.0 और उसके बाद के वर्शन वाली केबल के साथ काम नहीं करते. इसकी वजह, Apple के यूवीसी ड्राइवर में मौजूद गड़बड़ी है.