फ्रेम क्लिप, फ्रेम दर और वीडियो क्लिप के अन्य विशेषताओं को प्राप्त करना यदि आपको माइक्रोसॉफ्ट डायरेक्टशो एडिटिंग सर्विसेज (कोडनाम डेक्सटर) में एप्लिकेशन लिखने का अनुभव है, तो यह आपको बहुत परिचित लगेगा। विंडोज वातावरण में, परंपरागत रूप से अभी भी फ्रेम को कैप्चर करना सी ++ और डेक्सटर टाइप लाइब्रेरी का उपयोग डायरेक्टशो COM ऑब्जेक्ट्स तक पहुंचने के लिए किया गया है। .NET Framework में ऐसा करने के लिए, आप DexterLib की इंटरऑप असेंबली बना सकते हैं जो वीएस 2005 में COM संदर्भों के तहत सूचीबद्ध है। हालांकि यह आपके कोड को C++ से C# .NET में परिवर्तित करने का तरीका जानने के लिए एक अच्छी मात्रा में काम करता है। समस्या तब होती है जब आपको मूल फ़ंक्शन के लिए तर्क के रूप में पॉइंटर संदर्भ में पास करने की आवश्यकता होती है, सीएलआर सीधे पॉइंटर्स का समर्थन नहीं करता है क्योंकि प्रत्येक कचरा संग्रहण चक्र के बाद मेमोरी स्थिति बदल सकती है। आप CodeProject या अन्य स्थानों पर DirectShow का उपयोग करने के तरीके पर कई लेख पा सकते हैं और हम इसे सरल रखने की कोशिश करते हैं। यहां हमारा लक्ष्य वीडियो फ़ाइल को बिटमैप्स की सरणी में परिवर्तित करना है और मैंने इसे यथासंभव छोटा रखने की कोशिश की है, बेशक आप लाइव स्ट्रीम से बिटमैप्स प्राप्त करने के लिए अपना कोड लिख सकते हैं और उन्हें भेजने से कुछ ही समय पहले उन्हें बफर कर सकते हैं ।
असल में हम .NET में फ्रेम करने के लिए हमारे वीडियो फ़ाइल परिवर्तित करने के लिए डायरेक्टशो प्रयोग करने के लिए दो विकल्प है:
संपादित इंटरॉप विधानसभा और सी # .NET प्रकार के सूचक से प्रकार संदर्भ बदल जाते हैं। असुरक्षित कीवर्ड वाले पॉइंटर्स का उपयोग करें। हमने असुरक्षित (तेज़ पढ़ें) विधि चुना है। इसका मतलब है कि हम .NET प्रबंधित क्षेत्र के बाहर हमारे फ्रेम निकालते हैं। यह उल्लेख करना महत्वपूर्ण है कि प्रबंधित हमेशा बेहतर नहीं होता है और असुरक्षित वास्तव में असुरक्षित नहीं है!
मीडियाडेट क्लास मीडिया क्लास = नया मीडियाडेट क्लास(); _AMMediaType मीडिया टाइप; ... // वीडियो फ़ाइल लोड करें int outputStreams = mediaClass.OutputStreams; outFrameRate = 0.0; (int i = 0; i < आउटपुटस्ट्रीम; i ++) { mediaClass.CurrentStream = i; कोशिश करें { // यदि यह फ़्रेमेट प्राप्त कर सकता है, तो यह पर्याप्त है, // हम वीडियो फ़ाइल स्वीकार करते हैं अन्यथा यह outFrameRate = mediaClass.FrameRate पर अपवाद फेंकता है; ....... // विशेषताओं यहाँ
}catch
{ // Not a valid meddia type? go to the next outputstream }
} // कोई फ्रेम दर प्राप्त .....? यदि (आउटफ्रेमरेट == 0.0) नई फ़ाइल समर्थित नहीं है ("प्रोग्राम अक्षम है" + "वीडियो फ़ाइल पढ़ने के लिए।"); // हमारे पास एक फ़्रेमेट है? आगे बढ़ने ... ... // एक सरणी बिटमैप पकड़ और जानकारी संग्रहीत करने के // अन्य वस्तुओं intilize को बनाएं ...
असुरक्षित { ... // स्टोर करने के लिए एक बाइट सूचक बनाने BitmapBits
... जबकि (currentStreamPos < endPosition) { mediaClass.GetBitmapBits (currentStreamPos, रेफरी bufferSize, रेफरी * ptrRefFramesBuffer, outClipSize.Width, outClipSize.Height); HTTP से अधिक ...
// frameArray फ्रेम बिटमैप जोड़ने ... } } ...
स्थानांतरण निकाले गए डेटा अब तक हम बिटमैप फ्रेम की एक सरणी के लिए हमारे वीडियो परिवर्तित कर दिया है। अगला चरण क्लाइंट के ब्राउज़र पर HTTP पर हमारे फ्रेम को स्थानांतरित करना है। यह अच्छा होगा अगर हम क्लाइंट को बस हमारे बिटमैप बिट्स भेज सकें लेकिन हम नहीं कर सकते। HTTP को पाठ वर्णों को परिवहन करने के लिए डिज़ाइन किया गया है जिसका अर्थ है कि आपका ब्राउज़र केवल HTML वर्ण चरित्र सेट में परिभाषित वर्णों को पढ़ता है। इस एन्कोडिंग से बाहर कुछ भी सीधे प्रदर्शित नहीं किया जा सकता है।
इस चरण को पूरा करने के लिए, हम अपने बिटमैप को ASCII वर्णों में परिवर्तित करने के लिए बेस 64 एन्कोडिंग का उपयोग करते हैं। परंपरागत रूप से, ईमेल में ऑब्जेक्ट एम्बेड करने के लिए बेस 64 एन्कोडिंग का उपयोग किया गया है। गेको ब्राउज़र, ओपेरा, सफारी, और केडीई (आईई नहीं!) सहित लगभग सभी आधुनिक ब्राउज़र समर्थन डेटा: बेस 64 एन्कोडेड छवियों को प्रदर्शित करने के लिए यूआरआई योजना मानक। महान! अब, हमारे पास हमारे फ्रेम HTTP पर स्थानांतरित करने के लिए तैयार हैं।
System.IO.MemoryStream स्मृति = नई System.IO.MemoryStream(); जबकि (currentStreamPos < endPosition) { ... // (प्रबंधित) स्मृति vdeoBitmaps.Save (स्मृति, System.Drawing.Imaging.ImageFormat.Jpeg) में कहीं Bitmpas सहेजें; // इसे बेस 64 strFrameArray [frameCount] = System.Convert.ToBase64String (memory.ToArray()) में कनवर्ट करें; // अगले मेमोरी के लिए तैयार हो जाओ। (0, System.IO.SeekOrigin.Begin); } स्मृति। बंद करें(); ...
लेकिन हम केवल एक विशाल स्ट्रिंग के रूप में एन्कोडेड फ्रेम नहीं भेज सकते हैं। हम एक एक्सएमएल दस्तावेज़ बनाते हैं जिसमें वीडियो के बारे में हमारे फ्रेम और अन्य जानकारी होती है और फिर इसे क्लाइंट को भेजती है। इस तरह ब्राउज़र हमारे फ्रेम को डोम एक्सएमएल ऑब्जेक्ट के रूप में प्राप्त कर सकता है और आसानी से उनके माध्यम से नेविगेट कर सकता है। जरा कल्पना कितना आसान है एक वीडियो है कि XML स्वरूप में संग्रहीत किया जाता है संपादित करने के लिए है:
14,9850224700412 {चौड़ाई = 160, ऊंचाई = 120} ६.४७,३१,३३४ /9j/4AAQSkZJRgABAQEAYAB .... ....
इस प्रारूप में इसकी अपनी कमी भी है। बेस 64 एन्कोडेड एक्सएमएल फाइलों में कनवर्ट किए गए वीडियो कहीं भी 10% (अधिकतर एवीआई फाइल) के बीच कहीं भी 300% या उससे अधिक (कुछ डब्लूएमवी फाइलें) उनके बाइनरी समकक्ष से बड़े होते हैं।
यदि आप एक एक्सएमएल फ़ाइल का उपयोग कर रहे हैं, तो आपको वेब सर्वर की भी आवश्यकता नहीं है, आप HTML को स्थानीय निर्देशिका से खोल सकते हैं और इसे काम करना चाहिए! मैंने आलेख की डाउनलोड फ़ाइल में निष्पादन योग्य शामिल किया है जो आपकी वीडियो फ़ाइल को XML दस्तावेज़ में परिवर्तित कर सकता है जिसे बाद में ब्राउज़र में दिखाया जा सकता है। हालांकि बड़ी फाइलों और उच्च रिज़ॉल्यूशन वीडियो का उपयोग करना एक अच्छा विचार नहीं है!
ठीक है, अब हम अपने बेस 64 एन्कोडेड वीडियो एक्सएमएल दस्तावेज़ भेज सकते हैं क्योंकि हम किसी अन्य प्रकार की एक्सएमएल फाइलों के साथ करेंगे। कौन कहता है कि एक्सएमएल फाइलों को हमेशा
क्या मैं आपको सही तरीके से पढ़ रहा हूं कि आप एक ऐसा एप्लीकेशन लिखने की कोशिश कर रहे हैं जो दो फ्लैश ऐप्स के बीच स्थानांतरित हो रहा है (जिसमें से आपके आवेदन से जुड़ा हुआ नहीं है)? – bta