2012-07-09 16 views
11

मुझे आरटीएसपी पर H.264 वीडियो स्ट्रीमिंग में कुछ परेशानी हो रही है। लक्ष्य एक आरटीएसपी क्लाइंट (आदर्श रूप से अंत में एक ब्राउज़र प्लगइन) में कैमरा छवि को लाइव स्ट्रीम करना है। यह एक समस्या को छोड़कर अब तक बहुत अच्छी तरह से काम कर रहा है: वीडियो स्टार्टअप पर अंतराल होगा, हर कुछ सेकंड में स्टटर होगा, और इसमें ~ 4-सेकंड की देरी होगी। ये गलत है।स्ट्रीमिंग आरटीपी/आरटीएसपी: सिंक/टाइमस्टैम्प समस्याएं

हमारा सेटअप x264 (w/zerolatency & अल्ट्राफास्ट) के साथ एन्कोड करना है और ffmpeg 0.6.5 से libavformat के साथ RTSP/RTP में पैक किया गया है। परीक्षण के लिए, मुझे एक आरटीएसपी सर्वर से कनेक्ट करते समय जीएसटी-लॉन्च के साथ एक जीस्ट्रीमर पाइपलाइन के साथ स्ट्रीम प्राप्त हो रही है। हालांकि, मैं एक ही समस्या को फिर से उत्पन्न करने में सक्षम हूं जब सीधे किसी अन्य जीस्ट्रीमर इंस्टेंस से आरटीपी के साथ स्ट्रीमिंग करता हूं।

भेजा जा रहा है मशीन:

gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=10.89.6.3 

प्राप्त मशीन:

gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink 

तुम भी दोनों एक ही मशीन पर इन चला सकते हैं, बस इस पर 127.0.0.1 के लिए मेजबान बदल जाते हैं।

WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: A lot of buffers are being dropped. 
Additional debug info: 
gstbasesink.c(2875): gst_base_sink_is_too_late(): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: 
There may be a timestamping problem, or this computer is too slow. 

एक सामान्य रूप से सुझाव दिया "ठीक" है कि मैं इंटरनेट पर देखा है है उपयोग करने के लिए: प्राप्त अंत पर, आप हकलाना और कंसोल पर कई बार चेतावनी के साथ आम तौर पर खराब प्रदर्शन करने वीडियो, के साथ नोटिस देना चाहिए xvimagesink साथ sync=false:

gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false 

वीडियो तो लगभग शून्य विलंबता के साथ वापस खेलेंगे, तब भी जब हमारे कैमरे सॉफ्टवेयर के साथ परीक्षण किया गया। यह परीक्षण के लिए उपयोगी है, लेकिन तैनाती के लिए बहुत उपयोगी नहीं है, क्योंकि यह टोटेम, वीएलसी, या उनके ब्राउज़र प्लगइन एम्बेड के साथ काम नहीं करेगा।

मैं इस मुद्दे को हल करने का प्रयास करना चाहता हूं; मुझे संदेह है कि एच 264 स्ट्रीम पर x264 या शायद आरटीपी पेलोड पर किसी प्रकार की टाइमस्टैम्प जानकारी गायब है। स्रोत जीएसटी पाइपलाइन को संशोधित करने का कोई तरीका है ताकि मैं को sync=false रिसीवर पर उपयोग करने की आवश्यकता हो?

यदि यह संभव नहीं है, तो मैं ग्राहकों को कैसे बता सकता हूं (एसडीपी या अन्यथा के माध्यम से) कि स्ट्रीम को सिंक्रनाइज़ नहीं किया जाना चाहिए? आखिरकार, हम इसे एक वीएलसी प्लगइन का उपयोग कर ब्राउजर में एम्बेड करेंगे, इसलिए वहां एक समाधान जो काम करेगा वहां भी बेहतर होगा।

उत्तर

7

आप स्रोत जीएसटी पाइपलाइन में "सिंक = झूठी" जोड़ सकते हैं। उबंटू 12.04 पर जो अंतराल और त्रुटि संदेशों को दूर करने लगता है।

gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=127.0.0.1 sync=false 

और यहाँ है कि मैं क्या रिसीवर पर प्रयोग किया जाता है:

यहाँ आदेश मैं स्रोत पर इस्तेमाल किया है

gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink 

दुर्भाग्य से, मुझे पता नहीं क्यों कि काम करता है या यहाँ तक कि जो घटक "सिंक = झूठी" संपत्ति (स्रोत पाइपलाइन पर) से संबंधित है।

+0

आप .. धन्यवाद एक ही समस्या है लेकिन मैं "सिंक = false" दे दिया है रिसीवर पक्ष में और यह मेरे लिए काम किया। –

10

root.ctrlc पोस्ट के रूप में, आप सिंक = FALSE का उपयोग कर सकते हैं। हालांकि, आप प्रेषक के अंत में सीपीयू उपयोग में भारी वृद्धि देख सकते हैं। इसका कारण यह है कि सिंक = गलत बताते हैं कि जैसे ही यह उन्हें प्राप्त करता है, बफर को केवल धक्का देने के लिए सिंक को बताता है। सिंक पूरे पाइपलाइन ड्राइव करता है।इसलिए, सिंक = FALSE पाइपलाइन को वीडियो एन्कोड करने और इसे जितनी जल्दी हो सके यूडीपी पर धक्का देगी; यह 100% सीपीयू का उपयोग करेगा।

आपको क्या चाहिए gstrtpjitterbuffer है। यह टाइमस्टैम्प का भी ख्याल रखता है, जो यहां टूटा हुआ है।

उदाहरण इस:

gst-launch-0.10 -v videotestsrc ! videorate ! video/x-raw-yuv, framerate=30/1 ! ffmpegcolorspace ! x264enc ! rtph264pay ! udpsink port=50000 host=<sender IP> 

उदाहरण रिसीवर:

gst-launch-0.10 udpsrc port=50000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000 , encoding-name=(string)H264 , payload=(int)96" ! gstrtpjitterbuffer ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! videoscale ! "video/x-raw-yuv, width=320, height=240" ! xvimagesink 
+0

+1 लेकिन कैसे आप 'gstrtpjitterbuffer' का उपयोग जब हम का उपयोग जीएसटी-लॉन्च-0.10 -v' gstrtpbin नाम = rtpbin विलंबता = 40 udpsrc टोपियां = ".." बंदरगाह = 50000', आप साझा रिसीवर हिस्सा है, जबकि कृपया कर सकते हैं gstrtpbin का उपयोग कर इस्तेमाल किया? – YumYumYum

+0

gsrtpbin में पहले से ही एक gstrtpjitterbuffer शामिल है। कमांड लाइन के लिए, मैं आपको वापस आने की कोशिश करूंगा। वर्तमान में मैं इसे आजमा नहीं सकता, क्योंकि मेरे पास यहां GStreamer 0.10 इंस्टॉल नहीं है। (बीटीडब्ल्यू आपको वास्तव में 1.0 पर ले जाना चाहिए, इसकी दृढ़ता से अनुशंसा की जाती है।) –

+0

@dv_ 'gstrtpjitterbuffer' को इंगित करने के लिए धन्यवाद और' सिंक = झूठी 'के स्पष्टीकरण के लिए धन्यवाद। क्या आप कृपया बता सकते हैं कि पाइप अन्यथा कैसे संचालित होता है (जब 'सिंक = सत्य') होता है? – joanpau

0

मैं कितना यह सच है पता नहीं है, लेकिन जब मैं अपने लैपटॉप के लिए बैटरी चार्जर को जोड़ने के बिना मेरे पाइप लाइन चलाने के लिए, यह मुझे एक ही चेतावनी फेंक देता था, और जब मैंने बिजली की आपूर्ति में प्लग किया, तो मेरा विश्वास करो कि यह काम करता है। मुझे लगता है कि यह पुरानी सीएमओएस बैटरी की वजह से हो सकती है, जो काम नहीं कर रही है। क्योंकि यह घड़ी की पीढ़ी के लिए ज़िम्मेदार है।

+1

इस मामले में, मुझे संदेह होगा कि बैटरी पर चलते समय अधिकतम उपलब्ध CPU CPU को कम करने के लिए आपके लैपटॉप में पावर कॉन्फ़िगरेशन विकल्प होता है। जब आप चार्जर के साथ दौड़ते हैं, तो आप बैटरी पर चलते समय 100% सीपीयू प्राप्त करते हैं, तो आप कम हो जाते हैं। इसलिए "या यह कंप्यूटर बहुत धीमा है"। – KevinM

संबंधित मुद्दे