लिनक्स में कई USB वेबकैम का उपयोग करना


30

निम्नलिखित त्रुटि में डेबियन / लिनक्स में एक से अधिक USB वेब कैमरा चल रहे हैं:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

चीज़ और xawtv चलाकर एक ही त्रुटियों के बाद OpenCV में शुरू में एक प्रोग्रामिंग मुद्दा प्रतीत होता है जो एक रहस्यमय हार्डवेयर / सॉफ़्टवेयर समस्या की खोज में बदल गया था।

जाहिरा तौर पर यह यूएसबी होस्ट नियंत्रक पर सभी उपलब्ध बैंडविड्थ का अनुरोध करने वाले वेबकैम के कारण होता है। ध्यान में रखते मैं चलाने का फैसला किया है कि wireshark और capinfos सिर्फ कितना बैंडविड्थ एक कैमरे का इस्तेमाल किया देखने के लिए।

4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720

दिलचस्प! यह बता सकता है कि 320x240 पर दो कैमरे क्यों काम करते हैं लेकिन उच्चतर रिज़ॉल्यूशन विफल हो जाता है। यह ऐसा है जैसे मेरा USB नियंत्रक केवल USB 1 गति पर चल रहा है, फिर भी lsusb एक डिवाइस से संबंधित दोनों वेबकैम दिखाता है जो माना जाता है कि प्रति सेकंड 480 मेगाबिट का समर्थन करता है।

निम्नलिखित समाधानों को चलाने के द्वारा अपने अधिकतम उपयोग का अनुरोध करने के बजाए वेबकैम को अपने बैंडविड्थ उपयोग की गणना करने के लिए मजबूर करने का प्रस्ताव दिया गया है:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

दुर्भाग्य से इससे कोई फ़र्क नहीं पड़ा, इसलिए मैंने एक और उपाय आज़माने का फैसला किया। StackOverflow पर एक पोस्ट ने मेरे वेबकैम को MJPEG की तरह एक कम FPS या संपीड़ित वीडियो प्रारूप का उपयोग करने का सुझाव दिया, लेकिन v4lctl सूची चलाने के बाद यह या तो मेरे वेबकैम को उनके वीडियो मोड को बदलने का समर्थन नहीं करता।

और यहीं मैं फंस गया हूं। USB 2 की अधिकतम गति के नीचे अच्छे से काम करने वाले दो वेबकैम इस त्रुटि को क्यों उत्पन्न करेंगे?

ps: यह डिस्क स्थान समस्या नहीं है, df जब वेबकैम शुरू होता है तो कोई परिवर्तन नहीं दिखाता है।

pps: अगर इससे कोई फर्क पड़ता है, तो यहाँ lsusb का आउटपुट है

जवाबों:


25

डिंग डिंग! Freenode पर # v4l में अच्छे लोगों से कुछ मदद के साथ यह पता लगाने में कामयाब रहा।

लंबी कहानी छोटी: v4l2-ctl USB कैमरा मुद्दों को डीबग करने का सबसे अच्छा साधन है। सभी उपलब्ध कमांड और मैन पेज पढ़ें, यह मजेदार होगा जो मैं वादा करता हूं। V4l2-ctl के प्रयोग से मुझे पता चला कि मेरा एक कैमरा किसी भी संकुचित वीडियो मोड का समर्थन नहीं करता है। आप निम्न कमांड चलाकर अपने कैमरों के समर्थन के कौन से मोड की जाँच कर सकते हैं:

v4l2-ctl -d /dev/video0 --list-formats

जिसे कुछ इस तरह आउटपुट करना चाहिए।

 ioctl: VIDIOC_ENUM_FMT
 Index       : 0
 Type        : Video Capture
 Pixel Format: 'MJPG' (compressed)
 Name        : MJPEG

 Index       : 1
 Type        : Video Capture
 Pixel Format: 'YUYV'
 Name        : YUV 4:2:2 (YUYV)

यदि केवल पिक्सेल प्रारूप लौटाया गया है "YUYV", "IUYV", "I420", या "GBRG", तो आप केवल USB कैमरा प्रति USB नियंत्रक * चला पाएंगे क्योंकि वे प्रारूप असम्पीडित हैं। कई वेबकैम का उपयोग करना जो MJPEG या कुछ अन्य प्रकार के संपीड़न का समर्थन करता है, ठीक काम करेगा।

यदि आप मेरी तरह OpenCV का उपयोग करते हैं, तो चिंता न करें यदि डिफ़ॉल्ट पिक्सेल प्रारूप संपीड़ित नहीं है क्योंकि यह वैसे भी संपीड़न का उपयोग करने के लिए OpenCV चूक प्रतीत होता है।

** जब तक आप 320x240 रिज़ॉल्यूशन या कम के साथ खुश हैं। *


1
नमस्ते, यदि संभव हो तो, क्या आप मुझे बता सकते हैं कि मुझे 2 कैमरों के पिक्सेल प्रारूप को कैसे सेट करना चाहिए ताकि मैं 640x480 पर दोनों को कैप्चर कर सकूं? मैं OpenCV का उपयोग कर रहा हूं और वर्तमान में आप जैसी स्थिति का अनुभव कर रहा हूं, जहां दोनों कैमरे केवल 320x240 या उससे कम पर काम करेंगे
lexma

अहा! v4l2-ctlवास्तव में डिबगिंग के लिए एक उत्कृष्ट उपकरण है। मेरे कैमरे के बारे में बहुत कुछ पता चला, और समस्या को ठीक करने में सक्षम था। वैसे भी, मैं अपने कैमरे के रिज़ॉल्यूशन को कैमरा आउटपुट मोड के रूप में 320x240उपयोग करने के लिए मजबूर करके इसे ठीक करने में सक्षम था YUYVguvcviewने भी बहुत मदद की।

320x240 या उससे कम के प्रस्तावों का उपयोग करते समय, मुझे मिश्रित परिणाम मिलते हैं। मैंने 4 सस्ते USB वेबकैम खरीदे, जो सभी समान मेक / मॉडल हैं। जब 160x120 पर 2 चलाने की कोशिश कर रहे हैं, तो उनमें से कुछ एक साथ ठीक काम करेंगे और कुछ ने मेमोरी त्रुटि दी। मुझे इसमें कोई तुक या तर्क नजर नहीं आता। दी, इन वेबकैम की कीमत $ 3 / प्रत्येक है, इसलिए मुझे लगता है कि मुझे वह मिल गया जिसके लिए मैंने भुगतान किया था।
सेरिन

USB3.0 हब के माध्यम से भी उन कैमरों में से दो या अधिक को USB3.0 से जोड़ना ठीक काम करता है। YUYV के साथ जांच की गई।
मिचेल लियोन

7

इसका उत्तर स्वदेवर्फ्यू द्वारा लिखे गए यूवीवीडियो संशोधनों का उपयोग करना है, और ऊपर वर्णित है। उन्होंने और मैंने OpenWrt के लिए मॉडेड कोड को सफलता के साथ संकलित करने के लिए एक साथ काम किया है। जिस संस्करण पर मैं इसे चला रहा हूं वह OpenWRT DESIGNATED DRIVER (ब्लीडिंग एज, r48130) है, एक tplink wdr3600 राउटर पर:

परिणाम: मैं एक USB 2.0 हब के माध्यम से 1280x960 और MJPG प्रारूप में 15fps पर 3 * c270 (logitech) चल सकता है। मैं एक चौथाई c270 हुक करने के लिए नहीं है, माफ करना।

मेरे पास YUV फॉर्मेट के साथ 2 * c270 और 1 * GEMBIRD 640 * 480 * 15fps भी हो सकते हैं, लेकिन 2nd GEMBIRD को जोड़ने से खतरनाक "कैद शुरू करने में असमर्थ: डिवाइस पर कोई स्पेस नहीं बचा" (स्पेस == बैंडविड्थ यहां, जैसा कि आप। अच्छी तरह से जानते हैं:))। ध्यान दें कि GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/

3 * c270 के साथ CPU उपयोग wdr3600 पर काफी उचित है:

Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached

CPU:  16% usr  27% sys   0% nic  45% idle   0% io   0% irq  10% sirq

Load average: 1.20 0.85 0.44 4/60 2546

  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

 2240  1679 root     S    15348  12%  17% mjpg_streamer --input input_uvc.so --

 2505  1679 root     S    15368  12%  11% mjpg_streamer --input input_uvc.so --

 2239  1679 root     S    15532  12%  11% mjpg_streamer --input input_uvc.so --

यदि समुदाय कुछ प्रतिष्ठा और समर्थन देता है, तो मुझे लगता है कि SwDevRefugee Uvc-linux में कोड प्राप्त करने के लिए तैयार है।


4

मैं uvcvideo चालक को देखा और quirks = 128 मॉड्यूल पैरामीटर को नजरअंदाज कर दिया जाता है अगर धारा mjpeg को संपीड़ित किया जाता है।

मेरी पसंद की वेबकैम लॉजिटेक C500 और Logitech C270 है, और मैंने पाया कि C500 द्वारा 1280x1024 में निर्मित की गई छवि 100kbytes है और C270 द्वारा 1280x960 पर निर्मित की गई छवि 200kbytes है।

अगर मैं 10fps पर C270 चलाता हूं तो आवश्यक बिटरेट 10x200000x8 = 16Mbit / s है। Ubuntu 14.04 में uvcdriver मॉड्यूल हमेशा फ्रेम दर की परवाह किए बिना 196Mbit / s आवंटित करता है। C500 के लिए यह थोड़ा बेहतर व्यवहार है, लेकिन अभी भी एक बैंडविड्थ हॉग है।

मैंने uvcvideo ड्राइवर को संशोधित किया है ताकि मैं V4L2 इंटरफ़ेस के माध्यम से ड्राइवर को "संपीड़न" कारक प्रदान कर सकूं। यह एक "थोड़ा हैकी" है कि मैंने मूल्य को निर्दिष्ट करने के लिए v4l2_pix_format में निजी विशेषता का उपयोग किया है। चालक में यह असम्पीडित छवि के आकार की गणना करता है और फिर संपीड़न कारक द्वारा विभाजित होता है ताकि यह पता लगाया जा सके कि उपयोग करने के लिए यूएसबी बैंडविड्थ क्या है।

डिफ़ॉल्ट रूप से मैं 10 के एक संपीड़न कारक का उपयोग करता हूं जो एक बड़े मार्जिन की अनुमति देता है अगर कैमरा एक विशेष रूप से हार्ड छवि को संपीड़ित करने के लिए सामना करता है। 1280x960 और 10fps पर चलने वाला C270 अब 41Mbit / s का उपयोग करता है और मैं आसानी से एक बस में 4 कैमरे चला सकता हूं।

अगर किसी को इस सुविधा में दिलचस्पी है, तो मैं "संपीड़न" कारक अवधारणा पर विचार करने के लिए uvcvideo अनुरक्षकों को प्राप्त करने का प्रयास करूंगा।


मैं, और OpenROV समुदाय के अन्य संभावित रूप से uvc ड्राइवर @SwDevRocete को आपके मॉड को देखने के लिए उत्सुक होंगे। मैं OpenROV में दो वेबकैम को एकीकृत करने की कोशिश कर रहा हूं (एक नीचे की ओर दृश्य ओडोमेट्री देखने के लिए, दूसरा सामान्य पायलटिंग / देखने के लिए), लेकिन एक ही बीडब्ल्यू मुद्दे में चल रहा है। क्या आपने अपने मॉड पोस्ट करने या अपने बदलाव के लिए पुल अनुरोध सबमिट करने के बारे में सोचा है?

Uvc ड्राइवर में परिवर्तन का अनुरोध करने का आधिकारिक तरीका इस मेलिंग सूची के माध्यम से है: linux-uvc-devel@lists.sourceforge.net। मैंने आगे की जानकारी के साथ कुछ अन्य बाद के पोस्ट के साथ 30-दिसंबर, 2015 को अपना परिवर्तन अनुरोध पोस्ट किया। मुझे अनुचर से कोई प्रतिक्रिया नहीं मिली है। दो अन्य लोगों ने परिवर्तन में रुचि व्यक्त की है। मुझे नहीं पता कि किसी भी कार्रवाई को करने के लिए कितने आवश्यक हैं। शायद @laughlinb मेलिंग सूची में भी पोस्ट कर सकता है।
स्वदेवएलेन

@SwDevRefugee: मुझे आपकी सलाह unix.stackexchange.com/q/287279/52764
रागव

@ रैगव: मुझे लगता है कि आपको एक उचित व्यवहार अनुप्रयोग का उपयोग करके सभी कैमरों को एक साथ खोलने पर समस्या को अलग करने की आवश्यकता है, जैसे कि एक असफल व्यवहार जो कि विफलता होने पर आपको सूचनात्मक त्रुटि संदेश देना चाहिए।
स्वदेवएलेन

1
रागव की समस्या यह है कि उनके कैमरे केवल YUYV का समर्थन करते हैं और जब वह quirks = 0x80 ध्वज का उपयोग करता है, तो चालक उसे प्रति कैमरा कम से कम 1024 बाइट्स / माइक्रोफ़्रेम (65.5 Mbit / s) का उपयोग करने के लिए मजबूर करता है। यह इस तथ्य से जटिल है कि कैमरों का समर्थन सबसे कम बैंडविड्थ 2040 बाइट्स / माइक्रोफ्रेम है, भले ही वह केवल 6 गुना पर 320x240 चाहता है वह केवल एक यूएसबी बस में 2 कैमरे रख सकता है। 1024 बाइट्स / माइक्रोफ्रेम प्रतिबंध की न्यूनतम को कर्नेल के 2.6.32 और 3.16 रिलीज के बीच कहीं कहीं यूवीवीडियो चालक के लिए जोड़ा गया था।
स्वदेवएलेन

-1

मुझे वह स्थान त्रुटि से भी बाहर मिला। जो काम किया गया था, उनमें से एक कैमरे को अनप्लग करने और इसे मेरे स्थिर पीसी पर दूसरे यूएसबी पोर्ट में प्लग करने के लिए था - इसके बारे में बिखरे हुए कुछ 6 या 7 यूएसबी पोर्ट हैं। चल रहा है 'show_webcams 0 1' तो अचानक दो छवियों को लाया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.