2010-03-24 19 views
22

को मैं करने के लिए गतिशील रूप से उत्पन्न MP3 डेटा feed लिए मेरे एप्लिकेशन में एक हल्के वजन HTTP सर्वर लिखने के लिए कोशिश कर रहा हूँ में निर्मित AndroidMediaPlayer। मुझे अपनी सामग्री को SD card पर स्टोर करने की अनुमति नहीं है।स्ट्रीमिंग Android MediaPlayer

मेरा इनपुट डेटा अनिवार्य रूप से एक अनंत लंबाई का है। मैं MediaPlayer बताता हूं कि इसका डेटा स्रोत मूल रूप से "http://localhost/myfile.mp3" जैसा होना चाहिए। मेरे पास एक सरल सर्वर सेट अप है जो इस अनुरोध को करने के लिए MediaPlayer के लिए प्रतीक्षा करता है। हालांकि, MediaPlayer बहुत सहकारी नहीं है। सबसे पहले, यह HTTP GET बनाता है और पूरी फ़ाइल को पकड़ने का प्रयास करता है। अगर हम कोशिश करते हैं और socket में डेटा को डंप करते हैं तो हमने समय निकाल दिया है, इसलिए हमने भागों में डेटा लिखने के लिए HTTP रेंज हेडर का उपयोग करने का प्रयास किया। MediaPlayer इसे पसंद नहीं करता है और बाद के हिस्सों का अनुरोध नहीं करता है।

क्या किसी को भी सफलतापूर्वक स्ट्रीमिंग डेटा MediaPlayer में मिला है? क्या मुझे इसके बजाय RTSP या Shoutcast सर्वर को लागू करने की आवश्यकता है? क्या मैं बस एक महत्वपूर्ण HTTP header खो रहा हूँ? मुझे यहां किस रणनीति का उपयोग करना चाहिए?

+0

क्या आपने प्लेबैक वीडियो फ़ाइलों के लिए इस दृष्टिकोण का भी उपयोग किया था? क्या यह ऑडियो फाइलों के समान ही करता है? –

+0

हे रॉब को इस मुद्दे के लिए कोई कामकाज मिला है? क्या आप नमूना कोड साझा कर सकते हैं? –

+0

मुझे देर से पता है। लेकिन यह उन लोगों के लिए है जो भविष्य में यहां समाप्त होते हैं। यह [** लिंक **] (http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091) के साथ कोड शुरू करने के लिए है। – Samuel

उत्तर

3

HTTP सर्वर वास्तव में फोन पर होस्ट किया गया था। यह बहुत सरल था: threadHTTP GET अनुरोध के लिए सॉकेट पर सुनना। जब यह HTTP अनुरोध प्राप्त हुआ, तो यह new socket, कुछ HTTP शीर्षलेखों को वापस लिखेगा और MP3 ऑडियो डेटा को socket पर डंप करना शुरू कर देगा। यह HTTP सर्वर ने कुछ और नहीं किया।

Android Media Player संगीत चला रहा था क्योंकि मैं पर स्ट्रीमिंग कर रहा था। Media Player बहुत खराब व्यवहार करता है अगर उसके प्लेबैक buffer ऑडियो चलाते समय खाली हो गया था। यह सुनिश्चित करने के लिए कि HTTP सर्वर ने socket में डेटा लिखना जारी रखा है, यह मेरे लिए के लिए बहुत महत्वपूर्ण था। मैं छोटे टुकड़ों (10 केबी) में सॉकेट में बाइट ले जाया गया। मेरी HTTP प्रतिक्रिया पर हेडर इस तरह देख समाप्त हो गया: जब तक

// Build response headers 
StringBuilder sb = new StringBuilder(); 
sb.append("HTTP/1.1 200 OK\r\n"); 
sb.append("Content-Type: audio/mpeg\r\n"); 
sb.append("Connection: close\r\n"); 
sb.append("Accept-Ranges: bytes\r\n"); 
sb.append("Content-Length: " + totalFileSize + "\r\n"); 
sb.append("Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n"); 

के रूप में मैं पाइप stoked रखा, Android Media Player शिकायत के बिना यह लेने वाली रखा। ऑडियो बजाना केवल एक अनुरोध और प्रतिक्रिया की आवश्यकता है। यह बहुत अच्छा काम कर समाप्त हो गया।

+1

कोई भी मौका पूरा कोड कहीं भी होस्ट किया गया है? मैं MediaRecorder + कैमरा से आने वाले लाइव वीडियो के साथ ऐसा करने की कोशिश कर रहा हूं और विभिन्न प्रयासों और पुस्तकालयों का पीछा करने से थक गया हूं। यदि नहीं, तो यहां अधिक विस्तार जोड़ने के लिए क्या आकार बक्षीस होगा? – ChiefTwoPencils