मैं H264 एन्कोडिंग को छोड़ने के लिए Raspivid को कैसे प्राप्त कर सकता हूं? (5 सेकेंड लेटेंसी स्ट्रीमिंग वीडियो से छुटकारा)


11

एक पीआई-कैम के साथ एक निगरानी कैमरे के रूप में एक साथ पाई का उपयोग करते समय 5 सेकंड के विलंबता से छुटकारा पाने के बारे में मंचों और थ्रेड्स के गजिलियन होते हैं। कई ट्यूटोरियल दिखाते हैं कि आरटीपी प्रोटोकॉल का उपयोग करके छवियों को एन्कोड और स्ट्रीम करने के लिए vlc का उपयोग कैसे किया जाता है जिसके परिणामस्वरूप ~ 5 सेकंड का अंतराल होता है।

मेरे अनुसार, इसका कारण यह है कि Raspivid H264 पर स्ट्रीम को एन्कोडिंग कर रहा है, जबकि VLC को इसे फिर से डिकोड करना होगा और जो भी RTP है उसे फिर से एनकोड करना होगा। कमांडलाइन इस तरह दिखता है:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

पहला भाग मानक उत्पादन के लिए वीडियो स्ट्रीम करने के लिए raspivid बताता है:

raspivid -w 640 -h 480 -o - -t 0 

पाइप के बाद का हिस्सा, VLC को इसे लेने के लिए कहता है, और h264 का उपयोग करके इसे डीकोड करता है:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

यह mux-ing और demux-ing काफी संसाधनों की एक कमर है!

मुझे github पर raspicam के स्रोत मिले , और मुझे लगता है कि एन्कोडर को छोड़ने के लिए एनकोडर_buffer_callback विधि (वर्तमान में लाइन 848) में कुछ किया जा सकता है। हालाँकि, मैं ग में अच्छा नहीं हूं, और वीडियो एन्कोडिंग से बिल्कुल भी परिचित नहीं हूं, इसलिए मेरे पास कोई सुराग नहीं है कि कहां से शुरू करें।

जीथुब पर मैं 330 कांटे देख सकता हूं, लेकिन वे विशेष रूप से रास्पिकैम के लिए नहीं लगते हैं (बल्कि पूरे उपयोगकर्ता प्रोजेक्ट के लिए)। मैं एक कांटा है कि एन्कोडिंग को हटाने या mjpeg की तरह कुछ सरल लागू करने की कोशिश कर खो गया।

क्या सी और वीडियो कोडेक ज्ञान वाले कोई व्यक्ति मुझे और अन्य गज़िलियन उपयोगकर्ताओं को विलंबता से छुटकारा पाने में मदद कर सकता है? संभवत: समाधान उन कांटों में से एक में पहले से ही है, लेकिन मैंने बिना किसी भाग्य के इसे खोजने में घंटों बिताए हैं।

पीएस मैं एक ब्राउज़र समाधान की तलाश में नहीं हूं , लेकिन मैं अंततः इसे एक Synology में स्ट्रीम करना चाहता हूं, अधिमानतः mjpeg स्ट्रीमिंग का उपयोग करके (लेकिन एक वेबपेज के माध्यम से नहीं, बल्कि एक मानक mjpeg स्ट्रीम जो अधिकांश वाणिज्यिक आईपी-कैम में निर्मित होता है)। पहला कदम h264 से छुटकारा पा रहा है।


यह बहुत गहन जांच है। MJPEG का उपयोग करना सवाल से बाहर है क्योंकि (जिस समय मैं देख रहा था) JPEG एनकोडर में निर्मित कोई पुस्तकालय नहीं था और सॉफ्टवेयर बकवास था। मैं nginx-rtmp (FLV पैकेज्ड), कस्टम बिल्ड, का उपयोग करके लगभग 1s अंतराल प्राप्त करने में कामयाब रहा HD! पीआई ने लगभग 30% सीपीयू का उपयोग किया लेकिन वीएलसी ने समय सीमा के कारण इसे डिकोड करने के लिए संघर्ष किया जो गायब थे और इसके FLV को मिटा दिया :( इसके अलावा मेरे सीसीटीवी सॉफ्टवेयर ने वीएलसी सिंक और 1 720p स्ट्रीम का उपयोग किया 40% सीपीयू का उपयोग किया जब मैंने आखिरकार काम किया लेकिन बहुत था अस्थिर।
पिओट्र कुला

@ppumkin मैं नहीं मानता कि MJPEG प्रश्न से बाहर है। एक बार H264 चले जाने के बाद हम डिकोडिंग और री-एन्कोडिंग के ओवरहेड किए बिना जो कुछ भी चाहते हैं उसे सांकेतिक शब्दों में बदलना कर सकते हैं। वास्तव में H264 होना काफी लक्जरी है! केवल हमें इसे बंद करने में सक्षम होना चाहिए। यह एक आलीशान प्लशे पैड जैसा है और एक तंग शौचालय के चैंबर में हीरे जड़े हुए हैं, इसलिए कमरे में और कुछ नहीं बैठता (सिवाय कुछ हेडरूम के, जहां हम कूदकर थोड़ा नीचे जा सकते हैं) ... जब आप दरवाजा खोलते हैं, तो आपको चढ़ना पड़ता है एक उच्च आर्मरेस्ट पर, और जब आप बैठते हैं तो आपके पैरों के लिए कोई जगह नहीं है ...
लुई सोमरस

हां मैं समझता हूं कि आपका क्या मतलब है। मैंने अपने सीसीटीवी आईपी सर्वर को एक सभ्य गुणवत्ता में एमजेपीईजी प्राप्त करने की कोशिश में दिन बिताए हैं। कई चीजें बदल गई हैं, लेकिन प्रत्यक्ष हार्डवेयर जेपीईजी एनकोडिंग और एक स्ट्रीम में पाइपिंग गैर-मौजूद है, क्योंकि एपीआई avaible नहीं है। एकमात्र तरीका मुझे पता है कि सॉफ्टवेयर है और मुझे जो सबसे अच्छा समाधान मिला वह था nginx-rtmp JPEG सिंक। IPhone के लिए एचएलएस वास्तव में बहुत अच्छा काम करता है, लेकिन इसे 5s-10s lag मिला है :(
पिओटर कुला

1
आप इसे कैमरा सॉफ्टवेयर के लिए गीथब प्रोजेक्ट पर एक सवाल के रूप में उठाने की कोशिश कर सकते हैं। आपको शायद इस बात का स्पष्टीकरण मिल जाएगा कि ऐसा करना कठिन क्यों है, लेकिन अगर दूसरों को यह एक उपयोगी सुविधा लगती है, तो कोई इसे लागू कर सकता है।
टॉमजी

demux डिकोड के समान नहीं है ... कृपया इसे देखें
फ्लैश थंडर

जवाबों:


5

शायद यह नहीं है कि आप जवाब से क्या चाहते हैं, लेकिन मैं वीएलसी स्ट्रीमिंग की बिल्कुल भी सिफारिश नहीं करता हूं।

एक स्कूल प्रोजेक्ट के लिए, मैंने कुछ स्ट्रीमिंग विकल्पों की कोशिश की (आरपीआई पर भी!):

  • वीएलसी
  • MJPEG
  • GStreamer

VLC और MJPEG (और कुछ अन्य कम ज्ञात) का उपयोग करते हुए, मेरे पास 3 और 5 सेकंड के बीच विलंबता थी ..
GStreamer, NO LATENCY का उपयोग करके और सबसे अच्छा रिज़ॉल्यूशन (और बहुत सारे विकल्प) के साथ!
यदि आप रुचि रखते हैं, तो आप इसे यहाँ देख सकते हैं

और अगर आप इसका उपयोग करेंगे, तो यहां मेरी पाइपलाइन है:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
हां, मैंने पहले से ही Gstreamer की कोशिश की है और यह पीसी या तो स्ट्रीमिंग करते समय बहुत अच्छा काम करता है, लेकिन यह Synology DiskStation जैसे 3 पार्टी सॉफ्टवेयर के साथ अच्छी तरह से काम नहीं करता है। ऐसा लगता है कि GStreamer सिर्फ h264 स्ट्रीम का पुन: उपयोग करता है और इसे डिकोड किए बिना इसके चारों ओर एक स्ट्रीमिंग प्रोटोकॉल को लपेटता है, जो एक महान समाधान है लेकिन दुर्भाग्य से उपयोग की एक छोटी संख्या के लिए है। अगर मैं एक एंड्रॉइड डिवाइस पर स्ट्रीम देखना चाहता हूं तो मुझे इसके लिए अपना ऐप विकसित करना होगा। MJPEG बहुत अधिक व्यापक रूप से समर्थित है, और मुझे यकीन है कि Raspivid को VLC या तो छोड़ने के लिए अनावश्यक एन्कोडिंग को छोड़ने के लिए बदल दिया जा सकता है। किसी भी तरह से टिप के लिए धन्यवाद
लुई सोमरस

1
मेरे पास एक Synology भी है, लेकिन उस पर GStreamer को आज़माया नहीं गया (मेरा पर्याप्त शक्तिशाली नहीं है जो मुझे लगता है)। Btw, Android के बारे में, आप इसमें भी GStreamer का उपयोग कर सकते हैं! मैं इसे अपनी परियोजना के लिए उपयोग कर रहा हूँ और यह अच्छी तरह से काम कर रहा है :)!
वैल

Gstreamer के साथ समस्या यह फ्रेम डेटा में timeframeinterval और सिंक के रूप में इसके अनुपयोगी (विकल्प भी जोड़ा गया है !!) में शामिल हैं :( वहाँ के माध्यम से पाइप करने के लिए आधुनिक स्क्रिप्ट उपलब्ध हैं, लेकिन मैं अक्सर VLC बम को gstreamer को पुनर्जीवित पाया। 6 महीने पहले जब मैं saome CCTV करना चाह रहा था .. लेकिन इसने कभी मज़बूती से काम नहीं लिया :(
कुला

@ सच, ​​एंड्रॉइड के लिए एक एसडीके है, लेकिन प्ले-स्टोर में कई आउट-ऑफ-द-बॉक्स खिलाड़ी नहीं हैं जो gst-launch-1.0 -v tcpclientsrc होस्ट = 11.22.33.44 पोर्ट = 1234 जैसी पाइपलाइनों का समर्थन करते हैं! gdpdepay! rtph264depay! avdec_h264! वीडियोकॉनवर्ट! ऑटोवाइडोसिंक सिंक = गलत। IOS के लिए भी कम उपलब्ध है। Synology एक बेहतरीन हब है जो ज्यादातर मुख्यधारा के उपकरणों का समर्थन करता है, गति का पता लगा सकता है, रिकॉर्डिंग और सूचनाएं कर सकता है, सभी बॉक्स से बाहर (और एसडी कार्ड के बिना)।
लुई सोमरस

क्या आप अभी भी इस तरह का उपयोग कर रहे हैं? वहाँ नया U4VL ड्राइवर है, लेकिन अभी भी वही L264 VLC के लिए स्ट्रीमिंग के साथ समस्याओं
Piotr Kula

0

कुछ लोग इस पर कड़ी मेहनत कर रहे हैं क्योंकि मैंने पहली बार यह सवाल पूछा था, और इस समय तक कुछ विकल्प हैं (अजीब है कि किसी ने अभी तक इस सवाल का जवाब नहीं दिया है)। मैंने RaspberrIPCam की कोशिश की है और कुछ सफलता मिली है, हालांकि ऐसा लगता है जैसे rtsp पैकेट में एक बहुत ही कम TTL या कुछ और था। पाई मेरे पीसी के बगल में एक राउटर से सीधे जुड़ा हुआ है, यह पूरी तरह से काम करेगा। लेकिन जैसे ही मैंने कैम को स्थापित किया, जहां मैं चाहता था, और बीच में दो राउटर के साथ स्ट्रीम तक पहुंचने की कोशिश की, कोई छवि नहीं आएगी। मैंने स्रोत-कोड की जाँच की और TTL को अधिकतम पर सेट पाया। मैं इसे पूरी तरह से समझ नहीं पाया।

वर्तमान में मैं RaspberryIPCamera की सिफारिश करूँगा, जिसमें एक अच्छा यूजर इंटरफेस ( स्क्रीनशॉट देखें ) है और यहां तक ​​कि इसके लिए तैयार एसडी-कार्ड इमेज भी है। मैंने एसडी-कार्ड की कोशिश की है, लेकिन एक बड़ी सफलता (मेरे वर्तमान सेटअप) के साथ यहां बताए गए मैनुअल इंस्टॉलेशन को करने में पीछे हट गया । इसे एक Synology DiskStation तक हुक करने के निर्देश भी उपलब्ध हैं और मेरे सिस्टम पर पूरी तरह से काम कर रहे हैं। एसडी कार्ड छवि के साथ समस्या यह थी कि मैं एसडी कार्ड की पूरी सीमा तक फाइल सिस्टम का विस्तार करने में असमर्थ था (मैं भी जीपीओ पिन के माध्यम से कुछ रिले को नियंत्रित करने के लिए उस पर कुछ अन्य सामान चलाना चाहता हूं)।

उपरोक्त समाधान UV4L परियोजना के घटकों का उपयोग करता है। इस पृष्ठ पर UV4L परियोजना के प्रलेखन में भी उल्लेख किया गया है:

अन्य बातों के अलावा, यह एक वेब इंटरफेस प्रदान करता है जिसमें से वीडियो स्ट्रीम को विभिन्न तरीकों से देखना संभव है और एक कंट्रोल पेज किसी भी Video4Linux एप्लिकेशन के साथ स्ट्रीमिंग करते समय कैमरा सेटिंग्स को पूरी तरह से नियंत्रित करने की अनुमति देता है।

मैंने अभी तक इसे लेक की कोशिश नहीं की है, हालांकि अभी तक (क्योंकि मैं अपने वर्तमान सेट-अप को गड़बड़ाना नहीं चाहता)।


1
यकीन नहीं होता कि यह आपकी समस्या थी, लेकिन यदि आप एक राउटर के माध्यम से मल्टीकास्ट आरटीएसपी ट्रैफिक भेज रहे हैं, तो सुनिश्चित करें कि इसमें आईजीएमपी स्नूपिंग सक्षम है और सुनिश्चित करें कि आपका पीसी राउटर से आईजीएमपी प्रश्नों को ब्लॉक नहीं कर रहा है। अन्यथा राउटर को एहसास नहीं होगा कि आपका पीसी पैकेट प्राप्त करने की कोशिश कर रहा है, इसलिए यह उन पर कभी भी अग्रेषित नहीं होगा।
माल्विनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.