2012-09-10 17 views
13

में जाने के साथ स्ट्रीमिंग मैं अपने विंडोज 8 स्टोर (पूर्व में मेट्रो) ऐप में किसी सर्वर से डेटा को MediaElement में स्ट्रीम करना चाहता हूं। हालांकि, स्ट्रीमिंग करते समय मुझे स्ट्रीम को "रिकॉर्ड" करने की आवश्यकता है, इसलिए यदि अनुरोध किया जाता है तो इसे कैश से परोसा जा सकता है, इसलिए मैं सीधे यूआरएल को MediaElement में फ़ीड नहीं करना चाहता हूं।विंडोज 8

वर्तमान में, बड़ी बाधा है कि MediaElement.SetSource() एक IRandomAccessStream, नहीं एक System.IO.Stream स्वीकार करता है, जो कि मैं क्या HttpWebResponse.GetResponseStream() से मिलता है।

कोड मैं अब है, काम करते हैं जो नहीं करता है:

var request = WebRequest.CreateHttp(url); 
request.AllowReadStreamBuffering = false; 
request.BeginGetResponse(ar => 
       { 
        var response = ((HttpWebResponse)request.EndGetResponse(ar)); 
        // this is System.IO.Stream: 
        var stream = response.GetResponseStream(); 
        // this needs IRandomAccessStream: 
        MediaPlayer.SetSource(stream, "audio/mp3"); 
       }, null); 

वहाँ एक समाधान है कि मुझे ऑडियो स्ट्रीम करने के लिए अनुमति देता है है, लेकिन मेरे डिस्क पर धारा कॉपी करने के लिए जब यह रिमोट से पढ़ने समाप्त हो गया है की अनुमति देता है पक्ष?

+0

आप इसे लगा बाहर है परिवर्तित करने के लिए मदद मिलेगी? असल में मुझे इसे स्टोर करने की आवश्यकता नहीं है, मैं बस इसे सीधे स्ट्रीम करना चाहता हूं। – esskar

+0

@esskar वास्तव में नहीं। स्ट्रीमिंग सीधे यूआरएल, या 'InMemoryRandomAccessStream' प्रदान करके बहुत अच्छा काम करता है। समस्या स्ट्रीम को दो अलग-अलग स्थानों पर वितरित कर रही है। –

+0

जानकारी के लिए धन्यवाद। मैंने 'स्रोत 'संपत्ति को सीधे सेट करने का प्रयास किया, लेकिन यह मेरे लिए काम नहीं करता है। (मुझे गहरे में कहीं नल-रेफ अपवाद मिलते हैं), और मुझे पता नहीं चला है कि 'IRandomAccessStream' URL को कैसे बनाएं। लेकिन मैं आज इस पर काम करूंगा। – esskar

उत्तर

0

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

मैंने देखा कि मीडियाइलेमेंट एक फ़ाइल खोलने के बारे में चुनौतीपूर्ण हो सकता है, लेकिन मैंने इसे काम देखा है। हालांकि, मैं नहीं कह सकता कि यह कभी-कभी क्यों काम करता है और कभी-कभी ऐसा क्यों नहीं करता है।

0

मुझे लगता है कि यह आप स्ट्रीम IRandomAccessStream को

InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream(); 

using (Stream stream = response.GetResponseStream();) 
    { 
    await stream.CopyToAsync(ras.AsStreamForWrite()); 
    }