2011-09-27 28 views
8

के साथ कैप्चर करें मेरे पास ffmpeg पर आरटीपी पर एक वीडियो स्ट्रीम आ रही है और मैं इसे लाइव स्ट्रीमिंग प्रोसेसिंग के लिए अपने ओपनसीवी टूल्स पर पाइप करना चाहता हूं। आरटीपी लिंकेज काम कर रहा है क्योंकि मैं आने वाली डेटा को फाइल में भेज सकता हूं और इसे चला सकता हूं (या एफएफप्ले के जरिए खेल सकता हूं)। मेरा ओपनसीवी कार्यान्वयन भी कार्यात्मक है क्योंकि मैं एक फ़ाइल से वीडियो और वेबकैम पर कब्जा करने में सक्षम हूं।ffmpeg से स्ट्रीम वीडियो और ओपनसीवी

समस्या ओपनसीवी स्ट्रीमिंग है। मैंने सुना है कि यह नामित पाइप का उपयोग करके किया जा सकता है। सबसे पहले मैं पाइप पर ffmpeg आउटपुट स्ट्रीम कर सकता हूं और उसके बाद ओपनसीवी इस पाइप को खोल सकता है और प्रसंस्करण शुरू कर सकता है।

मैं क्या कोशिश की है:

$ mkfifo stream_pipe 

अगला मैं अपने ffmpeg आदेश का उपयोग आरटीपी से धारा खींच और को भेजने के लिए:

मैं द्वारा मेरी cygwin बैश में एक नामित-पाइप बनाने पाइप:

$ ffmpeg -f avi -i rtp://xxx.xxx.xxx.xxx:1234 -f avi -y out.avi > stream_pipe 

मैं अगर यह नामित पाइप को धारा भेजने के बारे में जाने के लिए सही तरीका है यकीन नहीं है, लेकिन यह उत्पादन ffmpeg से मुझे बिटरेट देता है की वजह से आदेश और काम को स्वीकार किया जा रहा है, एफपीएस, और ऐसे।

$ ./cvcap.exe stream_pipe 

जहां cvcap.cpp के लिए कोड इस करने पर निर्भर करता:

cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]); 

कार्यक्रम जब यह तक पहुँचने लटका रहा है

अगला मैं अपने OpenCV कब्जा समारोह में नामित पाइप का उपयोग एक पंक्ति, इसलिए, मैं सोच रहा हूं कि यह इस बारे में जाने का सही तरीका है या नहीं। मैंने कभी पहले नामित पाइप का उपयोग नहीं किया है और मुझे यकीन नहीं है कि यह सही उपयोग है या नहीं। इसके अलावा, मुझे नहीं पता कि मुझे ओपनसीवी में नामित पाइप को अलग-अलग संभालने की आवश्यकता है या नहीं - इस तरह के इनपुट को स्वीकार करने के लिए चारों ओर कोड बदलें। जैसे मैंने कहा, मेरा कोड पहले से ही फाइलों और कैमरा इनपुट स्वीकार करता है, मैं बस आने वाली स्ट्रीम पर लटका हूं। मैंने केवल सुना है कि नामित पाइप ओपनसीवी के लिए इस्तेमाल किया जा सकता है - मैंने कोई वास्तविक कोड या आदेश नहीं देखा है!

किसी भी मदद या अंतर्दृष्टि की सराहना की जाती है!

अद्यतन:

मेरा मानना ​​है कि नामित पाइप तरह से मैं इरादा में काम नहीं किया जा सकता। जैसा कि this साइगविन फोरम पोस्ट पर देखा गया है:

समस्या यह है कि सिगविन का फीफो का कार्यान्वयन बहुत छोटी है। मैं कुछ भी के लिए फीफो का उपयोग करने की सिफारिश नहीं करता लेकिन अनुप्रयोगों के सबसे सरल।

मुझे ऐसा करने का एक और तरीका ढूंढने की आवश्यकता हो सकती है। मैंने ffmpeg आउटपुट को सामान्य फ़ाइल में पाइप करने का प्रयास किया है और उसके बाद ओपनसीवी इसे एक ही समय में पढ़ता है। यह कुछ हद तक काम करता है, लेकिन मुझे लगता है कि फाइल को पढ़ने और लिखने के लिए खतरनाक हो सकता है - कौन जानता है कि क्या होगा!

+0

मैं कुछ ऐसा करने की कोशिश कर रहा हूं। क्या आपको कुछ लेख मिला जो पाइप/आदि के बारे में बताता है? –

+2

मुझे यह छोटी पोस्ट http://ffmpeg-users.933282.n4.nabble.com/h264-problem-td2574908.html ffmpeg-users फ़ोरम में जो उन्होंने पूरा किया, उस पर संकेत दिया, जिसने मुझे आशा दी। मैंने इसे किसी भी व्यक्ति को वीएलसी http://forum.videolan.org/viewtopic.php?f=32&t=69351 और x264 http://forums.creativecow.net/readpost/291/84 – chembrad

उत्तर

9

आशा है कि उत्तर देने में बहुत देर हो चुकी है, लेकिन मैंने कुछ समय पहले एक ही चीज़ की कोशिश की है, और यहां मैंने यह कैसे किया है।

ओपनसीवी के लिए वीडियो-डिकोडिंग बैकएंड वास्तव में ffmpeg है, इसलिए इसकी सभी सुविधाएं ओपनसीवी में भी उपलब्ध हैं।सभी इंटरफेस का खुलासा नहीं हुआ है, और इससे कुछ कठिनाइयों को जोड़ा जाता है, लेकिन आप ओपनसीवी में आरटीपी स्ट्रीम एड्रेस भेज सकते हैं।

cap.open("rtp://xxx.xxx.xxx.xxx:1234"); 

महत्वपूर्ण: OpenCV पासवर्ड से सुरक्षित आरटीपी धाराओं उपयोग करने में सक्षम नहीं है। ऐसा करने के लिए, आपको उपयोगकर्ता नाम और पासवर्ड प्रदान करना होगा, इसके लिए कोई एपीआई खुलासा नहीं है।

+0

के साथ कुछ ऐसा करने का प्रयास किया है। फ़ाइल को आरटीपी पर स्ट्रीम करने के लिए प्रयुक्त कमांड का उल्लेख करें? क्या आपने इसके लिए केवल ffmpeg का उपयोग किया था? या आपको कुछ और स्थापित करना पड़ा? – user2565010

+0

हाय सर! क्या आप ओपनसीवी का उपयोग कर नेटवर्क पर भेजने के लिए आरटीएमपी स्ट्रीम पर छवि को वापस लिखना चाहते हैं। धन्यवाद! –

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