रास्पबेरी कैम से H.264 को स्ट्रीम करने का आधुनिक तरीका


16

मुझे Pi B + और Pi कैमरा मिला है और अब मैं H.264 एन्कोडेड वीडियो को कैमरा से अपने होम सर्वर पर स्ट्रीम करने के लिए सबसे कुशल (कम CPU) और सबसे कम-विलंबता कॉन्फ़िगरेशन खोजने की कोशिश कर रहा हूं।

मैंने निम्नलिखित पढ़ा है:

  1. http://pi.gbaman.info/?p=150

  2. http://blog.tkjelectronics.dk/2013/06/how-to-stream-video-and-audio-from-a-raspberry-pi-with-no-latency/comment-page-1/#comments

  3. http://www.raspberrypi.org/forums/viewtopic.php?p=464522

(सभी लिंक gstreamer-1.0 का उपयोग करते हैं deb http://vontaene.de/raspbian-updates/ . main।)

पिछले वर्षों में इस संबंध में बहुत कुछ किया गया है।

मूल रूप से, हम पाइप के उत्पादन के लिए किया था raspividमें gst-launch-1.0(लिंक 1 देखें)।

तब (लिंक 2) सरकारी V4L2 ड्राइवर बनाया गया था जो अब मानक है, और यह सिर्फ gstreamer का उपयोग कर, सीधे एक पाइप के बिना डेटा प्राप्त करने देता (विशेष रूप से पोस्ट देखें towolf द्वारा »शनि दिसंबर 07, 2013 3:34 कड़ी में 2):

प्रेषक (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000

रिसीवर: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false

अगर मैं सही तरीके से समझूं, तो दोनों तरीके H264 डिकोडिंग करने के लिए GPU का उपयोग करते हैं, लेकिन बाद वाला थोड़ा कुशल है क्योंकि इसे दूसरी बार कर्नेल से गुजरने की आवश्यकता नहीं है क्योंकि इसमें शामिल प्रक्रियाओं के बीच कोई पाइप नहीं है।


अब इस बारे में मेरे कुछ सवाल हैं।

  1. क्या बाद में अभी भी कैमरे से कुशलतापूर्वक H264 प्राप्त करने का सबसे हालिया तरीका है? मैं के बारे में पढ़ा है gst-omx, जो की तरह gstreamer पाइपलाइनों की अनुमति देता है ... video/x-raw ! omxh264enc ! ...। क्या यह केवल उपयोग करने के लिए कुछ अलग करता है video/x-h264, या यह और भी अधिक कुशल हो सकता है? क्या फर्क पड़ता है?

  2. जब मैं video/x-h264 ...पाइपलाइन का उपयोग करता हूं तो मुझे यह कैसे पता चलता है कि gstreamer एन्कोडिंग प्लगइन वास्तव में उपयोग किया जाता है ? यह अन्य पाइपलाइन भागों की तुलना में मेरे इच्छित प्रारूप को निर्दिष्ट करने के लिए प्रतीत होता है, जहां मैं स्पष्ट रूप से (कोड) घटक (जैसे h264parseया fpsdisplaysink) का नाम देता हूं ।

  3. में लिंक 1 को यह जबाब Mikael Lepistö का उल्लेख है "मैं पक्ष स्ट्रीमिंग से एक अनावश्यक फिल्टर पास निकाला गया" , जिसका अर्थ है कि वह बाहर काट gdppayऔर gdpdepay। वे क्या करते हैं? उनकी आवश्यकता क्यों है? क्या मैं वास्तव में उनसे छीन सकता हूं?

  4. वह यह भी उल्लेख करता है कि प्राप्त पक्ष के caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"लिए मापदंडों को निर्दिष्ट करके udpsrc, वह स्ट्रीम के बीच में स्ट्रीमिंग शुरू / फिर से शुरू करने में सक्षम है। ये टोपियां क्या हासिल करती हैं, ये विशिष्ट विकल्प क्यों हैं, मैं उनके बारे में अधिक कहां पढ़ सकता हूं?

  5. जब मैं प्रश्न 3 और 4 में सुझाव दिया जाता हूं (जोड़ने caps, छोड़ने gdppayऔर gdpdepay) तब मेरा वीडियो विलंबता बहुत खराब हो जाता है (और लगता है कि संचय हो रहा है, समय के साथ विलंबता बढ़ जाती है, और कुछ मिनटों के बाद वीडियो बंद हो जाता है)! ऐसा क्यों हो सकता है? मैं मूल कमांड के साथ प्राप्त विलंबता प्राप्त करना चाहता हूं, लेकिन किसी भी समय स्ट्रीम में शामिल होने में सक्षम होने की विशेषता भी है।

  6. मैंने पढ़ा है कि आरटीएसपी + आरटीपी आमतौर पर नियंत्रण संदेशों और अन्य चीजों के लिए टीसीपी और यूडीपी: टीसीपी के संयोजन का उपयोग करते हैं जिन्हें खोना नहीं चाहिए, और वास्तविक वीडियो डेटा ट्रांसमिशन के लिए यूडीपी। उपरोक्त सेटअप में, क्या मैं वास्तव में इसका उपयोग कर रहा हूं, या क्या मैं केवल यूडीपी का उपयोग कर रहा हूं? यह मेरे लिए थोड़ा अपारदर्शी है कि क्या gstreamer इस बात का ध्यान रखता है या नहीं।

मैं इन सवालों के एक भी जवाब के लिए किसी भी सराहना करेंगे!


यह विचार कि पाइप का उपयोग |इस संदर्भ में किसी भी मुद्दे को बनाता है, बीएस का एक अविश्वसनीय टुकड़ा है क्या आपने किसी भी raspivid | cvlcतरीके की कोशिश की है ? मेरे पास इसके साथ खेलने के लिए बहुत लंबे या बहुत समय तक कैमरा नहीं था, लेकिन http स्ट्रीम (दूसरे छोर पर लाइनक्स पर देखने योग्य) का उत्पादन करने के लिए इसका उपयोग vlcकरना ठीक लगता है।
गोल्डीलॉक्स

@goldilocks मैं यह नहीं कह रहा हूं कि पाइप एक "मुद्दा" है, बस यह आवश्यक नहीं है और cat file | grep ...इसके बजाय कुछ ओवरहेड है, बस grep ... file। पाइप कर्नेल से कॉपी करने की एक और परत जोड़ता है, जो आसानी से मापने योग्य है, खासकर कम मेमोरी बैंडविड्थ वाले उपकरणों पर। अगर gstreamer डिवाइस फ़ाइल से direcly पढ़ सकते हैं, तो उसका उपयोग क्यों नहीं करते? आपके raspivid | cvlcसुझाव के बारे में : मैं इसका उपयोग कर रहा था इससे पहले कि मैं gstreamer आधारित समाधान पर स्विच करता, इसमें gstreamer की तुलना में 3 सेकंड अधिक विलंबता होती है (मुझे नहीं पता क्यों)।
nh2

हाँ, यह निश्चित रूप से कुछ विलंबता है। पाइप को गलत करें, "संदर्भ" के बारे में मेरी बात यह है कि यह संभवतः यहां अड़चन नहीं हो सकता है - नेटवर्क I / O परिमाण धीमे के आदेश होने जा रहा है, आदि आप सही हैं, हालांकि, यह CPU में थोड़ा जोड़ सकता है समय। बस मैं ज्यादा नहीं दांव लगाना होगा; पूर्ण रिज़ॉल्यूशन पर चलने पर, cvlc~ 45% का उपयोग होता है, लेकिन बस उस डेटा दर पर एक पाइप के माध्यम से चल रहा है (फिर से ध्यान में रखते हुए, पाइप इसे धीमा नहीं कर रहा है ) मुश्किल से सुई को स्थानांतरित करेगा, मुझे लगता है। जैसे <5%। यह पूरी तरह से तुच्छ नहीं है अगर आप निश्चित रूप से संभव के रूप में कुशलतापूर्वक के रूप में ऐसा करना चाहते हैं ...
गोल्डीलॉक्स

... मैं नहीं चाहता कि कोई और इसे पढ़कर यह आभास पाए कि यहां पाइप का उपयोग करना विलंबता मुद्दों या अन्य समस्याओं के लिए जिम्मेदार हो सकता है। वह एक लाल हेरिंग है। या मैं गलत हो सकता है;)
गोल्डीलॉक्स

यदि यह आपके बाद की दक्षता है, तो आप विशिष्ट रिज़ॉल्यूशन / फ्रेम दर पर विभिन्न तरीकों के लिए मनाया गया कुल सीपीयू उपयोग शामिल करना चाहते हैं। केवल एक ही मैंने कोशिश की है raspivid | cvlcऔर वह है 40-50%। लोग ऐसे प्रश्न का बेहतर जवाब दे सकते हैं जो उन्हें एक विशिष्ट आकृति में सुधार करने के लिए चुनौती देता है। अभी आप बहुत सारे क्यों पूछ रहे हैं, बिना यह बताए कि प्रत्येक क्यों महत्वपूर्ण है।
गोल्डीलॉक्स

जवाबों:


8

विकल्प:

  1. raspivid -t 0 -o - | nc -k -l 1234

  2. raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264

  3. cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'

  4. raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234

  5. gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234

  6. uv4l --driver raspicam

  7. picam --alsadev hw:1,0

विचार करने के लिए बातें

  • विलंबता [एमएस] (क्लाइंट से सर्वर से अधिक एफपीएस चाहने के लिए और बिना पूछे)
  • सीपीयू निष्क्रिय [%] (द्वारा मापा गया top -d 10)
  • सीपीयू 1 ग्राहक [%]
  • RAM [MB] (RES)
  • समान एन्कोडिंग सेटिंग्स
  • वही सुविधाएँ
    • ऑडियो
    • पुनः कनेक्ट
    • ओएस स्वतंत्र ग्राहक (vlc, webrtc, आदि)

तुलना:

            1    2    3    4    5    6    7
latency     2000 5000 ?    ?    ?    ?    1300
CPU         ?    1.4  ?    ?    ?    ?    ?
CPU 1       ?    1.8  ?    ?    ?    ?    ?
RAM         ?    14   ?    ?    ?    ?    ?
encoding    ?    ?    ?    ?    ?    ?    ?
audio       n    ?    ?    ?    ?    y    ?
reconnect   y    y    ?    ?    ?    y    ?
any OS      n    y    ?    ?    ?    y    ?
latency fps ?    ?    ?    ?    ?    ?    ?

1
इस तालिका के सभी मान " ?" क्यों हैं ?
1955

1
@ लार्क्स क्योंकि कोई भी इस 'सामुदायिक विकि' पर डेटा को जांचने और भरने की परवाह नहीं करता है
user1133275

6

किसी ब्राउज़र में H264 को स्ट्रीम करने का एकमात्र आधुनिक तरीका UV4L के साथ है : कोई विलंबता, कोई कॉन्फ़िगरेशन, वैकल्पिक ऑडियो के साथ, वैकल्पिक दो-तरफ़ा ऑडियो / वीडियो। कोई जादू GStreamer सॉस, फिर भी इसके उपयोग का विस्तार करना संभव है।


1
चूंकि मैं अपने सर्वर और संभावित स्मार्टफ़ोन पर स्ट्रीम करना चाहता हूं, ब्राउज़र के लिए स्ट्रीमिंग की आवश्यकता नहीं है। इसके अलावा, ब्राउज़र इस पर अतिरिक्त प्रतिबंध लगा सकता है (जैसे कि कोई आरटीएसपी, संभवतः कोई टीसीपी नहीं जब तक आप वेबआरटीसी का उपयोग नहीं करते हैं, लेकिन यह पूरी तरह से है)। लेकिन UV4L अभी भी आशाजनक लग रहा है। क्या आप ऐसी जगह से जुड़ सकते हैं, जहां मैं इस बारे में पढ़ सकता हूं कि इसका उपयोग कैसे करें / नेटवर्क पर स्ट्रीमिंग के लिए इससे डेटा प्राप्त करें?
nh2

पवित्र गाय, मुझे लगता है कि मुझे उदाहरण पृष्ठ मिला ... यह बात सब कुछ करने में सक्षम लगती है ! RTMP, RTSP, HTTPS स्ट्रीमिंग, WebRTC, "रियल-टाइम ऑब्जेक्ट डिटेक्शन एंड ऑब्जेक्ट ट्रैकिंग + फेस डिटेक्शन" - व्हाट द हेल ?? कुछ सरल कमांड लाइन झंडे के साथ प्रत्येक uv4l? मेरे gstreamer पाइपलाइन अब बहुत पुराना लग रहा है! प्रतीक्षा करने के लिए परीक्षण नहीं किया जा सकता कि विलंबता कैसे है!
nh2

1
अरे नहीं, यह बंद स्रोत है :( जो इसे घर की निगरानी के उपयोग के लिए अयोग्य घोषित करता है जिसका मैंने ध्यान रखा था :(
nh2

यह WebRTC, 2-वे WebRTC का समर्थन करता है। विलंबता ~ 200ms ऑडियो / वीडियो, ऑडियो शायद कम है
प्रिंसएक्स

@ nh2, लिंक टूटने लगता है, क्या आपके पास उस उदाहरण पृष्ठ के लिए कोई अद्यतन स्थान है?
पुनीत सोनी

1

1.) पूरे नेटवर्क में h264es स्ट्रीमिंग (केवल नमूना)

सर्वर पर:

raspivid -v -a 524 -a 4 -a "rpi-0 %Y-%m-%d %X" -fps 15 -n -md 2 -ih -t 0 -l -o tcp://0.0.0.0:5001

ग्राहक पर:

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer h264es ffmpeg://tcp://<rpi-ip-address>:5001

2.) नेटवर्क भर में mjpeg स्ट्रीमिंग (केवल नमूना)

सर्वर पर:

/usr/local/bin/mjpg_streamer -o output_http.so -w ./www -i input_raspicam.so -x 1920 -y 1440 -fps 3

ग्राहक पर:

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer lavf http://<rpi-ip-address>:8080/?action=stream

यह सब आरपीआई शून्य डब्ल्यू (सर्वर के रूप में कॉन्फ़िगर) पर भी काम करता है


अरे, आपके उत्तर के लिए धन्यवाद, क्या sample onlyमतलब है?
nh2

मैं कहना चाहता था कि 'यह केवल एक उदाहरण है।' आप इसे अपनी आवश्यकताओं के लिए अनुकूलित कर सकते हैं।
स्पार्कली

1

मुझे आश्चर्य है कि इस थ्रेड पर अधिक कार्रवाई नहीं हुई है, मैं इस सवाल के जवाब का महीनों से पीछा कर रहा हूं।

मैं एक पीआई कैमरा (सीएसआई) से एक जानूस सर्वर पर स्ट्रीम करता हूं, और मैंने पाया कि सबसे अच्छी पाइपलाइन है

gst-launch-1.0 v4l2src ! video/x-h264, width=$width, height=$height, framerate=$framerate/1 ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink sync=false host=$host port=$port

v4l2src मेमोरी कुशल bmc2835-v4l2 मॉड्यूल का उपयोग करता है और हार्डवेयर संपीड़ित h264 वीडियो को सीधे खींचता है। पीआई शून्य पर, जीएसटी-लॉन्च 4% और 10% सीपीयू के बीच खपत करता है, 30fps पर 1280x720 स्ट्रीमिंग करता है। मैं gdppay का उपयोग किए बिना किसी भी समय स्ट्रीम को फिर से शुरू करने में सक्षम हूं। सुनिश्चित करें कि आपने mmal v4l2 ड्राइवर प्राप्त करने के लिए rpi-update चलाया है। मेरी पीआई भी स्थिरता के लिए और over_voltaged से गुजर रही है, और दिनों के लिए निर्बाध प्रवाह, यहां देखें

ऊपर

मैं ओपी के पास उन्हीं समस्याओं को लेकर लड़खड़ा गया। सबसे निराशाजनक समस्या थी 5 - समय के साथ विलंबता जमा हो रही थी, और अंततः पाई को दुर्घटनाग्रस्त कर दिया। समाधान sync=falseudpsink तत्व है। Gstreamer डॉक्स में तत्व के बारे में अधिक जानकारी नहीं है, बस यह घड़ी सिंक को अक्षम करता है, लेकिन बहुत सारे आँसू के बाद, मुझे पता चला कि मैं अब विलंबता जमा किए बिना घंटों तक स्ट्रीम कर सकता हूं।

मैंने समस्या 4 भी लड़ी, मैं एक स्ट्रीम को फिर से शुरू नहीं कर सका या स्ट्रीम शुरू होने के बाद देखना शुरू नहीं कर सका। इसका समाधान config-intervalएसपीएस और पीपीएस फ्रेम को रिबोरकास्ट करता है। config-interval=1हर फ्रेम में पैक का उपयोग करते हुए , मुझे लगता है, जो मुझे किसी भी समय एक स्ट्रीम चुनने की अनुमति देता है।

मैं ffmpeg पाइपलाइन का उपयोग करते हुए एक ही स्ट्रीम के बहुत करीब हो गया:

ffmpeg -f h264 -framerate $framerate -i /dev/video0 -vcodec copy -g 60 -r $framerate -f rtp rtp://$hostname:$port

लेकिन मैं स्ट्रीम को फिर से शुरू नहीं कर सकता, अगर मैं स्ट्रीम नहीं करते हुए स्ट्रीमिंग के दौरान एक पृष्ठ को ताज़ा करता हूं। मुझे लगता है कि यह एसपीएस और पीपीएस फ्रेम के कारण है। अगर किसी को पता है कि उन्हें ffmpeg के साथ कैसे पैक करना है, तो मुझे जानना अच्छा लगेगा।

btw मैं भी v4l2-ctl का उपयोग परम को सेट करने के लिए करता हूं, ffmpeg को चौड़ाई और ऊंचाई जैसी सेटिंग्स को स्वचालित रूप से पहचानने लगता है, लेकिन gstreamer के लिए उन्हें मिलान करना होगा कि हार्डवेयर क्या उत्पादन कर रहा है

v4l2-ctl --set-fmt-video=width=$width,height=$height,pixelformat=4
v4l2-ctl --set-ctrl=rotate=$rotation
v4l2-ctl --overlay=1
v4l2-ctl -p $framerate
v4l2-ctl --set-ctrl=video_bitrate=4000000 //or whatever

1
यह वास्तव में सवाल का जवाब नहीं देता है। यदि आपका कोई अलग प्रश्न है, तो आप प्रश्न पूछकर क्लिक करके पूछ सकते हैं । पर्याप्त प्रतिष्ठा होने पर आप इस प्रश्न पर अधिक ध्यान आकर्षित करने के लिए एक इनाम भी जोड़ सकते हैं । - रिव्यू से
डौगी

1
मुझे लगता है कि यह करता है! ओपी ने पी से स्ट्रीम करने के लिए सबसे आधुनिक, कुशल तरीका पूछा। मेरे द्वारा पोस्ट की गई gstreamer पाइपलाइन बिल्कुल यही है। मैंने यह भी बताया कि ओपी अपनी पाइपलाइन में क्या गायब था, और महत्वपूर्ण पाइपलाइन तत्व क्या हैं। मैं सीधे सीपीयू लोड को संबोधित करने के लिए अपनी प्रतिक्रिया संपादित कर रहा हूं, शायद यह मदद करता है।
बेन ओलायिन्का

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