2016-01-13 9 views
6

मैं एक ऐप लिखने की कोशिश कर रहा हूं जो स्क्रीन की एक वीडियो स्ट्रीम कैप्चर करेगा और इसे रिमोट क्लाइंट को भेज देगा। मुझे पता चला है कि विंडोज़ पर एक स्क्रीन कैप्चर करने का सबसे अच्छा तरीका DXGI Desktop Duplication API (विंडोज 8 के बाद से उपलब्ध) का उपयोग करना है। माइक्रोसॉफ्ट एक साफ sample प्रदान करता है जो स्क्रीन पर डुप्लिकेट फ्रेम स्ट्रीम करता है। अब, मैं सोच रहा हूं कि सबसे आसान, लेकिन अभी भी अपेक्षाकृत तेज़ तरीका है कि उन फ्रेम को एन्कोड करें और उन्हें नेटवर्क पर भेजें।डीएक्सजीआई डेस्कटॉप डुप्लिकेशन: नेटवर्क पर उन्हें भेजने के लिए एन्कोडिंग फ्रेम

फ्रेम AcquireNextFrame से एक सतह के साथ आते हैं जिसमें डेस्कटॉप बिटमैप और मेटाडेटा होता है जिसमें गंदे और अद्यतन क्षेत्रों को स्थानांतरित किया जाता है।

  1. एक DirectX सतह से एक बिटमैप निकालें और फिर 264 के लिए बिटमैप की श्रृंखला सांकेतिक शब्दों में बदलना और RTSP से अधिक इसे भेजने के लिए ffmpeg की तरह एक बाहरी पुस्तकालय का उपयोग करें: यहाँ से, मैं दो विकल्प है। सरलता से, मुझे डर है कि यह विधि बहुत धीमी होगी क्योंकि यह किसी भी मूल विंडोज विधियों का लाभ नहीं उठा रही है। एक ffmpeg- संगत बिटमैप में D3D बनावट को कनवर्ट करना अनावश्यक काम की तरह लगता है।
  2. From this answer: डी 3 डी बनावट को IMFSample में परिवर्तित करें और फ्रेम को एन्कोड करने के लिए मीडियाफाउंडेशन के SinkWriter का उपयोग करें। मुझे वीडियो एन्कोडिंग के this tutorial मिले, लेकिन मुझे अभी तक एन्कोडेड फ्रेम प्राप्त करने का एक तरीका नहीं मिला है और इसे सभी को वीडियो फ़ाइल में डंप करने के बजाय भेज दिया गया है।

चूंकि मैंने पहले ऐसा कुछ नहीं किया है, इसलिए मैं पूछ रहा हूं कि मैं सही दिशा में आगे बढ़ रहा हूं या नहीं। अंत में, मैं एक साधारण, अधिमानतः कम विलंबता डेस्कटॉप कैप्चर वीडियो स्ट्रीम चाहता हूं, जिसे मैं रिमोट डिवाइस से देख सकता हूं।

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

उत्तर

4

आप H264 एन्कोडिंग के लिए IMFTransform इंटरफ़ेस का उपयोग कर सकते हैं। एक बार जब आप से IMFSample मिल ID3D11Texture2D सिर्फ IMFTransform :: ProcessInput को इसे पारित और IMFTransform :: ProcessOutput से इनकोडिंग IMFSample मिलता है।

एन्कोडिंग विवरण के लिए this उदाहरण देखें।

एक बार जब आप एन्कोडेड IMFSamples प्राप्त कर लेते हैं तो आप उन्हें नेटवर्क पर एक-एक करके भेज सकते हैं।

+0

आपका लिंक मर चुका है –

+1

लिंक मिला [यहां] (https://github.com/ashumeow/webrtc4all/blob/master/gotham/MFT_WebRTC4All/test/test.cc) –

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