2011-07-03 14 views
9

संपादित करें संपादित करें: मैंने इस प्रश्न को बेहतर ढंग से स्पष्ट करने के लिए अपना प्रश्न बदल दिया। DirectShow.Net लाइब्रेरी का उपयोग कर एक बाइट सरणी (एम्बेडेड संसाधन से लिया गया) से वीडियो चलाने के लिए कैसे संभव है?स्ट्रीम

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

अग्रिम धन्यवाद।

+0

संसाधन आसानी से नेट असेंबली से निकाले जा सकते हैं। आप डेटा एन्क्रिप्ट कर सकते हैं, लेकिन कुंजी को आपके कोड में होना चाहिए, और फिर स्रोत को आसानी से आपके .NET असेंबली से निकाला जा सकता है। – habakuk

+0

मैं SmartAssembly जैसे संरक्षक का उपयोग करने जा रहा हूं। –

उत्तर

4

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

स्वयं-होस्टेड एंडपॉइंट मीडिया को आपके एम्बेडेड संसाधनों से खींच सकता है और इसे वहां से स्ट्रीम कर सकता है।

+0

धन्यवाद, यह एक बहुत अच्छा विचार है। क्या सिल्वरलाइट एप्लिकेशन और विंडोज़ एप्लिकेशन के बीच बातचीत करने के लिए डब्ल्यूसीएफ आरआईए सेवाओं का उपयोग करना संभव है? –

+1

मुझे निश्चित रूप से पता नहीं है। क्या आप इसका थोड़ा और वर्णन कर सकते हैं? आप एक डेस्कटॉप ऐप को डब्ल्यूसीएफ आरआईए सेवा होस्ट करना चाहते हैं और उसके बाद क्लाइंट पर चलने वाले चांदी की ऐप भी चाहते हैं? सिद्धांत रूप में, मुझे लगता है कि यह काम करेगा, लेकिन यह निश्चित रूप से एक गैर-मानक उपयोग-मामला है। आपको क्रॉस डोमेन सामान के साथ कुछ समस्याएं हो सकती हैं। – NathanAW

+0

जैसा कि मैंने उल्लेख किया है, मैं स्ट्रीम के रूप में एक वीडियो संसाधन खेलने के लिए goinig हूँ। चूंकि मुझे एक आसान समाधान नहीं मिला, मैंने सोचा कि यह विंडोज अनुप्रयोग में Silverlight MediaElement नियंत्रण का उपयोग करने के लिए व्यावहारिक हो सकता है, क्योंकि MediaElement मीडिया स्ट्रीम प्रकार के स्ट्रीम को स्वीकार करता है। –

1

ऐसा लगता है कि समस्या यह है कि डायरेक्टशो लाइब्रेरी का उपयोग करने के लिए समस्या इतनी अधिक नहीं है (the `DirectShow.Net Forum विशेष रूप से इसके लिए डिज़ाइन की गई है), बल्कि एम्बेडेड संसाधन का उपयोग कैसे करें।

मैं कुछ साल पहले अनुबंध अनुबंध पर कुछ ऐसा चला गया जहां एक नियोक्ता चिंतित था कि कुछ ग्राहक अपनी मालिकाना जानकारी चुरा सकते हैं। मेरी जानकारी सैकड़ों पीडीएफ दस्तावेज़ों में थी, लेकिन विचार वीडियो फ़ाइलों के लिए समान काम करता है।

  • पहले, संसाधनों की अपनी सूची में वीडियो फ़ाइल जगह:: मैं Visual Studio उपयोग करते हैं, तो मैं Project के गुण के लिए जाना, संसाधन टैब क्लिक करें, चयन

    यहाँ कैसे मैं इस समस्या घेरने की कोशिश की है फ़ाइलें विकल्प चुनें, फिर Add Resource>Add Existing File...

  • कोड फ़ाइल आप का उपयोग किया जाएगा करने के लिए निम्न दो namespaces जोड़ें:

using System.IO; 
using System.Diagnostics; 
  • अंत में, जहाँ आप अपने वीडियो फ़ाइल खेलना चाहते हैं, बस निम्न जैसा कुछ कार्य करें:
Process player = null; 
string tempFile = "~clip000.dat"; 
try { 
    File.WriteAllBytes(tempFile, Properties.Resources.MyMovie_AVI); 
    player = Process.Start(tempFile); 
    player.WaitForExit(); 
} finally { 
    File.Delete(tempFile); 
} 

सबसे अधिक संभावना, तो आप करेंगे Process.Start विधि को कॉल कर रहे हैं, बल्कि ऐप ropriate DirectShow विधि। विचार अभी भी वही है: byte सरणी के रूप में अपने संसाधनों को निकालें, उन्हें एक नए, अस्थायी फ़ाइल पर लिखें, फ़ाइल का उपयोग करें, फिर जब भी आप पूरा कर लें तो उस फ़ाइल को हटा दें।

finally ब्लॉक में Delete बयान डाल करने के लिए इतना है कि यदि कोई त्रुटियां होती हैं या जब फ़ाइल अभी भी खेल रहा है अपने उपयोगकर्ता कार्यक्रम बंद कर देता है, आपके आवेदन अभी भी पुरानी फाइल साफ सुनिश्चित करें।

संपादित करें:

मैं इस ऐसा करने का एक व्यावहारिक तरीका हो सकता है लगता है:

using (MemoryStream ms = new MemoryStream(Properties.Resources.MyMovie_AVI)) { 
    // Now you have to find a way in `DirectShow` to use a Stream 
} 
+0

धन्यवाद, लेकिन यह एक सुरक्षित समाधान नहीं है। उपयोगकर्ता अभी भी temp निर्देशिका से वीडियो फ़ाइल की प्रतिलिपि बना सकते हैं। मैं हार्ड डिस्क पर संसाधन सामग्री लिखने के बिना नौकरी करना चाहता हूं। –

+0

ऊपर संपादित करें देखें। मैंने एक 'मेमोरीस्ट्रीम' विकल्प जोड़ा। क्या 'डायरेक्टशो' में कुछ भी है जो स्ट्रीम लेता है? – jp2code

+0

धन्यवाद, मुझे पता है कि एम्बेडेड संसाधन से वीडियो फ़ाइल पढ़ने के लिए मेमोरीस्ट्रीम का उपयोग कैसे करें, समस्या यह है कि "बाइट सरणी से वीडियो कैसे चलाएं?"। –

1

आप एक अलग लाइब्रेरी का उपयोग कर सकते हैं?

मैंने WPF MediaKit का उपयोग सुरक्षित, लाइव एच 264 वीडियो स्ट्रीम की कुछ गैर-मानक स्ट्रीमिंग करने के लिए किया था। डेवलपर (जर्मिया मोरिल) बहुत ही उत्तरदायी था, और अनुकूलन मैं कर सकता था व्यापक था (क्योंकि आप स्रोत प्राप्त करते हैं)।

उस बिंदु पर, आप वीडियो को एक एम्बेडेड संसाधन के रूप में एम्बेड कर सकते हैं, बाइट सरणी (शायद किसी भी समय या पूरी फ़ाइल में इसका हिस्सा) स्मृति में लोड कर सकते हैं, और स्मृति से खेल सकते हैं।

+0

धन्यवाद, अंतर्निहित समर्थित कोडेक्स क्या हैं? –

+0

आप शर्त लगाते हैं। यह थोड़ी देर हो गया है, लेकिन मुझे विश्वास नहीं है कि इसमें कोई अन्य कोडेक शामिल है; यह सिस्टम पर पहले से इंस्टॉल किए गए लोगों का उपयोग करता है। – Jason

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

  • कोई संबंधित समस्या नहीं^_^