2010-02-28 8 views
8

मुझे अपने सी ++ एप्लिकेशन में फ्लैश ऑडियो द्वारा भेजे गए ध्वनि स्ट्रीम को पढ़ने की आवश्यकता है (सी ++ वास्तविक सीमा नहीं है, यह सी # या कोई अन्य डेस्कटॉप भाषा हो सकती है)। अब फ्लैश ऐप ऑडियो फ्लैश ऐप पर ऑडियो भेजता है लेकिन मुझे डेस्कटॉप एप्लिकेशन द्वारा एक ही ऑडियो प्राप्त करने की आवश्यकता है। तो, क्या यह एक मानक या सर्वोत्तम तरीका है कि इसे कैसे किया जाए?फ्लैश द्वारा भेजे गए सी ++ (सी #) ध्वनि स्ट्रीम का उपयोग कैसे पढ़ा जाए?

आपके उत्तरों के लिए धन्यवाद।

+1

क्या मैं आपको सही तरीके से पढ़ रहा हूं कि आप एक ऐसा एप्लीकेशन लिखने की कोशिश कर रहे हैं जो दो फ्लैश ऐप्स के बीच स्थानांतरित हो रहा है (जिसमें से आपके आवेदन से जुड़ा हुआ नहीं है)? – bta

उत्तर

0

आप the sound system from the Gnash project का उपयोग करने का प्रयास कर सकते हैं।

+0

मुझे लगता है कि Gnash सहेजे गए swf फ़ाइल से ऑडियो ऑब्जेक्ट पढ़ सकता है। लेकिन मुझे फ्लैश प्लगइन द्वारा एक और फ्लैश प्लगइन (http का उपयोग करके या इसका उपयोग करने के लिए) द्वारा भेजा गया ऑडियो स्ट्रीम प्राप्त करने की आवश्यकता है। – Oleg

1

ध्वनि वास्तव में कैसे भेजी जाती है? नेटवर्क के माध्यम से?

संपादित करें: आप या तो HTTP स्ट्रीम, या एक आरटीएमपी स्ट्रीम से ऑडियो कैप्चर करेंगे। पता लगाने के लिए Wireshark चलाएं, लेकिन मुझे संदेह है कि आप थोड़ा सा छाया कर रहे हैं ...

+0

प्रारंभिक विचार फ़्लैश ऐप और सी ++ ऐप को कनेक्ट करना और दोनों दिशाओं में ध्वनि भेजना था। लेकिन ऐसा लगता है कि ऐसा करने का कोई मानक तरीका नहीं है। तो, हम अब नए दृष्टिकोण का उपयोग कर रहे हैं: हम 2 क्लाइंट कनेक्ट करने के लिए फ्लैश मीडिया सर्वर और आरटीएमपी का उपयोग करते हैं। यह दृष्टिकोण काम करता है। लेकिन फिर - फ्लैश मीडिया सर्वर से आरटीएमपी ध्वनि धारा को कनेक्ट और चलाने का कोई मानक तरीका नहीं है यदि आप फ्लैश का उपयोग नहीं करते हैं। मैं अब इस पर काम कर रहा हूं। – Oleg

0

तो मूल रूप से आप फ्लैश मीडिया सर्वर से आरटीएमपी ध्वनि स्ट्रीम से मनमाने ढंग से गैर-फ़्लैश एप्लिकेशन से कनेक्ट करना चाहते हैं? क्या आपने http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol पर एक नज़र डाली है?

+0

निश्चित रूप से, मैंने इसे देखा है। असल में मैंने पहले ही सी ++ आरटीएमपी लाइब्रेरी लागू की है और आरटीएमपी सर्वर से कनेक्ट कर सकते हैं और ध्वनि स्ट्रीम पढ़ सकते हैं। मैं उस के लिए तैयार समाधान खोजने की उम्मीद कर रहा था लेकिन कोई तैयार समाधान नहीं मिला। तो, मैं इसे स्वयं करता हूं। – Oleg

+1

http://rtmpdump.mplayerhq.hu/ जो आप चाहते हैं –

0

दुर्भाग्यवश, एडोब अपेक्षाकृत स्वामित्व है (इसलिए हाल ही में सेब-एडोब युद्ध हो रहा है), लेकिन कई भाषाओं के लिए, आरटीएमपी के साथ मदद करने के लिए परियोजनाएं हैं।

WebOrb, वाणिज्यिक है नेट, जावा, PHP के लिए: मैं http://www.fluorinefx.com/

मैं या तो अपने आप RTMP के लिए उपयोग नहीं किया है, लेकिन: http://www.themidnightcoders.com/products.html

FluorineFX केवल .NET के लिए खुला स्रोत है फ़्लैश फ्लोटिंग (एएमएफ) गेटवे से कनेक्ट करने के लिए फ्लूराइनएफएक्स का इस्तेमाल किया जाता है। मुझे लगता है कि यह एक .NET- सक्षम क्लाइंट से ऑडियो स्ट्रीम प्राप्त करने के लिए आवश्यक हो सकता है।

+0

मैंने सी ++ पर अपना खुद का आरटीएमपी क्लाइंट लिखा था। आरटीएमपी हिस्सा सबसे आसान था। फिर मैं ऑडियो स्ट्रीम को डीकोड करने की समस्या में भाग गया और इसमें बहुत अधिक समय और प्रयास हुआ। परियोजना रद्द कर दी गई और हमने एफएमएस का उपयोग करके कार्य किया और खुद फ्लैश किया। वह बहुत आसान था ... – Oleg

0

फ्रेम क्लिप, फ्रेम दर और वीडियो क्लिप के अन्य विशेषताओं को प्राप्त करना यदि आपको माइक्रोसॉफ्ट डायरेक्टशो एडिटिंग सर्विसेज (कोडनाम डेक्सटर) में एप्लिकेशन लिखने का अनुभव है, तो यह आपको बहुत परिचित लगेगा। विंडोज वातावरण में, परंपरागत रूप से अभी भी फ्रेम को कैप्चर करना सी ++ और डेक्सटर टाइप लाइब्रेरी का उपयोग डायरेक्टशो 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 एन्कोडेड वीडियो एक्सएमएल दस्तावेज़ भेज सकते हैं क्योंकि हम किसी अन्य प्रकार की एक्सएमएल फाइलों के साथ करेंगे। कौन कहता है कि एक्सएमएल फाइलों को हमेशा

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