2009-10-30 8 views
19

के साथ स्ट्रीमिंग एएसी ऑडियो जैसा कि मैं इसे समझता हूं, एंड्रॉइड केवल एएसी प्रारूप ऑडियो चलाएगा यदि इसे एमपीईजी -4 या 3 जीपीपी के रूप में एन्कोड किया गया है।एंड्रॉइड

मैं ऐप के लिए स्थानीय होने पर एम 4 ए के रूप में एन्कोड किए गए एएसी ऑडियो को चलाने में सक्षम हूं, लेकिन यह सर्वर से प्राप्त करते समय विफल रहता है।

निम्न कार्य करता है, क्योंकि एम 4 ए फ़ाइल स्थानीय/रेस निर्देशिका में स्थानीय रूप से आयोजित की जाती है।

MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*); 
mp.start(); 

निम्नलिखित काम नहीं करता है। (लेकिन एमपी 3 के साथ करता है)।

Uri uri = Uri.parse("http://*example.com*/blah.m4a"); 
MediaPlayer mp = MediaPlayer.create(this, uri); 
mp.start(); 

क्या कोई भी प्रकाश डाल सकता है कि एम 4 ए ऑडियो फ़ाइल स्थानीय नहीं होने पर यह विफल क्यों हो सकता है?

यहाँ (कुछ) त्रुटि ...

ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus 
ERROR/MediaPlayer(769): error (200, -32) 
WARN/PlayerDriver(542): PVMFInfoErrorHandlingComplete 
DEBUG/MediaPlayer(769): create failed: 
DEBUG/MediaPlayer(769): java.io.IOException: Prepare failed.: status=0xC8 
DEBUG/MediaPlayer(769):  at android.media.MediaPlayer.prepare(Native Method) 
DEBUG/MediaPlayer(769):  at android.media.MediaPlayer.create(MediaPlayer.java:530) 
DEBUG/MediaPlayer(769):  at android.media.MediaPlayer.create(MediaPlayer.java:507) 
... 

मैं एसडीके 1.6 लक्ष्य कर रहा है।

+0

आप फ़ाइल स्वरूपों के साथ एन्कोडिंग उलझन में हैं। एएसी एक ऑडियो एन्कोडिंग प्रारूप है। एम 4 ए एक फ़ाइल प्रकार, या पैकेज है, जो एएसी डेटा के आसपास बैठता है। 3 जीपीपी समान है लेकिन इसमें अन्य प्रकार के एन्कोडेड ऑडियो शामिल हो सकते हैं। यहां देखें http://developer.android.com/guide/appendix/media-formats.html और यहां http://en.wikipedia.org/wiki/M4a देखें। – greg7gkb

+0

सच है, मुझे एएसी ऑडियो के लिए 3 जीपीपी और एम 4 ए को "कंटेनर" के रूप में वर्णित करना चाहिए था। मेरे सिर के ऊपर से * मुझे लगता है * एम 4 ए केवल स्थिर फाइलों के लिए उपयोग किया जा सकता है, और 3 जीपीपी केवल HTTP की बजाय आरटीएसपी का उपयोग कर स्ट्रीम कर सकता है? यह HTTP स्ट्रीमिंग के लिए समस्याएं पैदा करेगा। अगर मैं गलत हूं तो मुझे सही करें ... – bdls

उत्तर

0

यह अंधेरे में एक जंगली शॉट है, लेकिन मैंने फ़्लैश प्लेयर के साथ समान व्यवहार देखा है जहां यह वास्तव में फ़ाइल नाम को अनदेखा करता है और केवल सर्वर द्वारा भेजे गए एमआईएमई प्रकार पर निर्भर करता है। कोई विचार है कि example.com से हेडर को क्या भेजा जा रहा है? हो सकता है कि आप अपने blah.m4a को उस पृष्ठ में लपेटने का प्रयास करें जो हेडर सेट कर सकता है और फिर बाइनरी डेटा स्ट्रीम कर सकता है। इन प्रकार के एक शॉट दे दो और समुदाय क्या काम करता है की पुष्टि की सराहना करेंगे:

ऑडियो/एमपीईजी ऑडियो/mp4a ऑडियो/mp4a-latm ऑडियो/aac ऑडियो/x-aac

+0

एक अच्छा सुझाव - धन्यवाद। दुर्भाग्यवश मेरे पास संभावित सामग्री-प्रकारों की एक सरणी की कोशिश करने की कोई किस्मत नहीं है। संदर्भ के लिए, मैंने उन लोगों को सूचीबद्ध किया है जिन्होंने नीचे काम नहीं किया है। यह अभी भी संभव है कि HTTP हेडर के साथ कुछ करना है - या कुछ - यह हो सकता है कि यह खिलाया जा सकता है कि यह कितना व्यस्त है। 'ऑडियो/एम 4 ए ऑडियो/एएसी ऑडियो/एएसीपी ऑडियो/एक्स-एएसी ऑडियो/एमपीईजी ऑडियो/एमपी 4 ए ऑडियो/एमपी 4 ए-लैटम ऑडियो/एमपी 4' – bdls

+1

मुझे निश्चित रूप से इसके साथ एक समस्या का सामना करना पड़ा। हमारे स्ट्रीमिंग उद्देश्यों के लिए, MediaPlayer स्ट्रीमिंग फ़ाइल नहीं चलाएगा जब तक कि Http शीर्षलेख सामग्री-प्रकार सही ढंग से सेट नहीं किया गया हो। दिलचस्प बात यह है कि सामग्री की लंबाई की आवश्यकता नहीं थी। – greg7gkb

5

यह काम -अराउंड आपको नेट से एम 4 ए फाइलें चलाने की अनुमति देता है (और एमपी 4 & 3 जीपी जैसे अन्य कंटेनर में एएसी फाइलें)। यह बस फ़ाइल डाउनलोड करता है और कैश से खेलता है।

private File mediaFile; 

private void playAudio(String mediaUrl) { 
    try { 
     URLConnection cn = new URL(mediaUrl).openConnection(); 
     InputStream is = cn.getInputStream(); 

     // create file to store audio 
     mediaFile = new File(this.getCacheDir(),"mediafile"); 
     FileOutputStream fos = new FileOutputStream(mediaFile); 
     byte buf[] = new byte[16 * 1024]; 
     Log.i("FileOutputStream", "Download"); 

     // write to file until complete 
     do { 
      int numread = is.read(buf); 
      if (numread <= 0) 
       break; 
      fos.write(buf, 0, numread); 
     } while (true); 
     fos.flush(); 
     fos.close(); 
     Log.i("FileOutputStream", "Saved"); 
     MediaPlayer mp = new MediaPlayer(); 

     // create listener to tidy up after playback complete 
     MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mp) { 
       // free up media player 
       mp.release(); 
       Log.i("MediaPlayer.OnCompletionListener", "MediaPlayer Released"); 
      } 
     }; 
     mp.setOnCompletionListener(listener); 

     FileInputStream fis = new FileInputStream(mediaFile); 
     // set mediaplayer data source to file descriptor of input stream 
     mp.setDataSource(fis.getFD()); 
     mp.prepare(); 
     Log.i("MediaPlayer", "Start Player"); 
     mp.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+5

अच्छा विचार लेकिन निश्चित रूप से इसे पूरी फ़ाइल को चलाने से पहले डाउनलोड करने की आवश्यकता होती है। कुछ परिस्थितियों के लिए उपयोगी हो सकता है लेकिन स्पष्ट रूप से एक स्ट्रीमिंग समाधान के रूप में उपयुक्त नहीं है। – greg7gkb

+0

यह सच है, हालांकि इस कोड को स्थानीय फ़ाइल या फ़ाइलों को अस्थायी परिपत्र बफर के रूप में उपयोग करके स्ट्रीमिंग समाधान बनाने के लिए बनाया जा सकता है। यह दुर्भाग्यपूर्ण है कि MediaPlayer इनपुट इनपुट से प्राप्त नहीं कर सकता है या आप मानक तरीके से एक गोलाकार बफर करने में सक्षम होंगे। – bdls

-2

कोशिश -

1) MP.prepareAsync()

2) onPrepared() { mp.start() }

0

मैं एक smal ब्लॉग एक क्लाउड-आधारित समाधान मैं एक म्यूजिक प्लेयर मैं विकासशील हूँ के लिए उपयोग पर लिखा था। यह युवा एंड्रॉइड क्लाउड सर्विसेज (एसीएस) प्रोजेक्ट पर आधारित है, जो अभी तक उपलब्ध नहीं है, लेकिन फिर भी, यह किसी भी मीडिया फ़ाइलों को स्ट्रीम करने के लिए क्लाउड-आधारित ट्रांसकोडिंग का उपयोग करके संभावित समाधान दिखाता है। http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html

योएल

+0

हाय जोएल। यह एक संभावित विकल्प है, हालांकि यह एएसी के अन्य प्रारूपों (कम बिटरेट पर उच्च कथित गुणवत्ता) के फायदे को हटा देता है क्योंकि आप अंत में एमपी 3 स्ट्रीम कर रहे हैं। – bdls

2

वहाँ एक Freeware Advanced Audio (AAC) Decoder for Android: एक नज़र डालें। आप इसे सहायता और मार्गदर्शन के लिए उपयोग कर सकते हैं या प्लेबैक एएसी ऑडियो में मल्टीप्लेयर क्लास का उपयोग कर सकते हैं। वहाँ एक नमूना एप्लिकेशन और उस में पुस्तकालय मदद करने के लिए आप समझ

आशा इस मदद करता है

+0

यह लिखा गया है "कृपया ध्यान दें कि इस सॉफ़्टवेयर के उपयोग के लिए पेटेंट रॉयल्टी के भुगतान की आवश्यकता हो सकती है। आपको व्युत्पन्न कार्यों के निर्माण शुरू करने से पहले इस मुद्दे पर विचार करने की आवश्यकता है। हम पेटेंट शाही के लिए किसी भी तरह से आपको वारंटी नहीं दे रहे हैं या क्षतिपूर्ति नहीं कर रहे हैं! आप हैं अपने स्वयं के कार्यों के लिए पूरी तरह उत्तरदायी! एएसी पेटेंट के बारे में अधिक जानकारी के लिए, कृपया http://www.vialicensing.com/licensing/aac-fees.aspx पर जाएं " => सुनिश्चित नहीं है कि यह एक अच्छा विचार है इस पुस्तकालय का प्रयोग करें! –

3

एक open source OpenMXPlayer कैसे दोनों को स्थानीय फ़ाइलों या ऑनलाइन/सूत्रों स्ट्रीमिंग के लिए ऑडियो को संभालने के लिए दिखाता है कि वहाँ है। यह न केवल एएसी, बल्कि अन्य लोकप्रिय प्रारूपों का भी समर्थन करता है।

इसके पीछे विचार, एंड्रॉइड 4.1 में पेश किए गए MEDiaCodec API का उपयोग करना है।

उम्मीद है कि यह एक अच्छा प्रारंभिक बिंदु प्रदान करता है, किसी को भी त्वरित और परेशानी रहित ऑडियो प्लेयर कार्यान्वयन की आवश्यकता होती है।

1

मैंने इसे भी आजमाया लेकिन मुझे समाधान नहीं मिला!

अंतिम Google I/O में मैंने कुछ ऐसा देखा जो मुझे बहुत मदद करता था। यह मीडियाप्लेयर से विस्तार कर रहा है और बहुत सी चीजों में सुधार कर रहा है! जरा देखो तो।

EXOPLAYER आप बहुत मदद कर सकते हैं

चेक उदाहरण के इस हिस्से:

private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; 
private static final int BUFFER_SEGMENT_COUNT = 256; 
... 

// String with the url of the radio you want to play 
String url = getRadioUrl(); 
Uri radioUri = Uri.parse(url); 
// Settings for exoPlayer 
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); 
String userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); 
DataSource dataSource = new DefaultUriDataSource(context, null, userAgent); 
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
radioUri, dataSource, allocator, BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT); 
audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource); 
// Prepare ExoPlayer 
exoPlayer.prepare(audioRenderer); 

EXOPLAYER- मैं streamings (वीडियो और ऑडियो) से कुछ भी खेल सकते हैं!

मुझे पता है कि अगर आपको इसे लागू करने में मदद की आवश्यकता है! :)