MediaPlayer का उपयोग करके Android में एक URL से ऑडियो स्ट्रीमिंग करना?


86

मैं Android के MediaPlayer वर्ग में निर्मित http का उपयोग करके एमपी 3 पर स्ट्रीम करने की कोशिश कर रहा हूं। प्रलेखन मुझे सुझाव देगा कि यह उतना आसान होना चाहिए:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();

हालाँकि मुझे बार-बार निम्नलिखित मिल रहा है। मैंने अलग-अलग URL भी आज़माए हैं। कृपया मुझे यह न बताएं कि स्ट्रीमिंग एमपी 3 पर काम नहीं करती है।

E/PlayerDriver(   31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver(   31): PVMFInfoErrorHandlingComplete
E/MediaPlayer(  198): error (1, -4)
E/MediaPlayer(  198): start called in state 0
E/MediaPlayer(  198): error (-38, 0)
E/MediaPlayer(  198): Error (1,-4)
E/MediaPlayer(  198): Error (-38,0)

किसी भी मदद की बहुत सराहना की, धन्यवाद एस


कुछ प्रश्न: (1) जो एसडीके संस्करण आप उपयोग कर रहे हैं? (२) आप किस डिवाइस (उपकरणों) पर परीक्षण कर रहे हैं? यह SDK 2.0.1 पर ठीक काम करता है, एक Droid पर परीक्षण।
रोमन नूरिक

हाय रोमन, समय निकालने के लिए धन्यवाद। मैं 1.6 के खिलाफ यह कोशिश कर रहा हूं और मैं एक एचटीसी हीरो का उपयोग कर रहा हूं। मैं इसे आपकी टिप्पणियों के प्रकाश में 2.01 पर आजमाऊंगा, लेकिन यह एक हास्यास्पद परिणाम होगा यदि यह केवल 2.x और उसके बाद के उपकरणों पर काम करता है।
पंडालओवर 22

बस इसे एक 2.01 एमुलेटर पर आजमाया। दुर्भाग्य से काम नहीं करता है। मैं वास्तविक 1.6 डिवाइस और वास्तविक 2.01 डिवाइस के खिलाफ यह कोशिश करने के लिए तैयार हूं। मैं 4 पर Google परीक्षण में हूं। शायद मुझे तब तक इंतजार करना पड़ेगा। मैं हालांकि नहीं करना चाहते हैं।
पंडालोवर

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

अरे बस बाहर चर्चा मैं एक सवाल है। यदि मैं mp.setDataSource (URL_OF_FILE) का उपयोग करता हूं; हमें ऑडियो स्ट्रीमिंग के लिए किसी भी फ़ाइल को सहेजने की आवश्यकता नहीं है। है ना? तो यह किसी भी स्थान से ऑडियो स्ट्रीम करने का सबसे अच्छा तरीका है। कोई विचार?
बोहेमियन

जवाबों:


78

सरल मीडिया प्लेयर स्ट्रीमिंग उदाहरण के साथ। एक्सएमएल भाग के लिए आपको आईडी बटन 1 के साथ एक बटन की आवश्यकता होती है और आपके ड्रॉबल फ़ोल्डर में नाम बटन_पॉज और बटन_प्ले के साथ दो छवियों की आवश्यकता होती है और कृपया अपने मेनिफेस्ट में इंटरनेट की अनुमति जोड़ना न भूलें।

public class MainActivity extends Activity {
private Button btn;
/**
 * help to toggle between play and pause.
 */
private boolean playPause;
private MediaPlayer mediaPlayer;
/**
 * remain false till media is not completed, inside OnCompletionListener make it true.
 */
private boolean intialStage = true;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = (Button) findViewById(R.id.button1);
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    btn.setOnClickListener(pausePlay);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

private OnClickListener pausePlay = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub

        if (!playPause) {
            btn.setBackgroundResource(R.drawable.button_pause);
            if (intialStage)
                new Player()
                        .execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3");
            else {
                if (!mediaPlayer.isPlaying())
                    mediaPlayer.start();
            }
            playPause = true;
        } else {
            btn.setBackgroundResource(R.drawable.button_play);
            if (mediaPlayer.isPlaying())
                mediaPlayer.pause();
            playPause = false;
        }
    }
};
/**
 * preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread.
 * @author piyush
 *
 */

class Player extends AsyncTask<String, Void, Boolean> {
    private ProgressDialog progress;

    @Override
    protected Boolean doInBackground(String... params) {
        // TODO Auto-generated method stub
        Boolean prepared;
        try {

            mediaPlayer.setDataSource(params[0]);

            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                    intialStage = true;
                    playPause=false;
                    btn.setBackgroundResource(R.drawable.button_play);
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                }
            });
            mediaPlayer.prepare();
            prepared = true;
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            Log.d("IllegarArgument", e.getMessage());
            prepared = false;
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            prepared = false;
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            prepared = false;
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            prepared = false;
            e.printStackTrace();
        }
        return prepared;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if (progress.isShowing()) {
            progress.cancel();
        }
        Log.d("Prepared", "//" + result);
        mediaPlayer.start();

        intialStage = false;
    }

    public Player() {
        progress = new ProgressDialog(MainActivity.this);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        this.progress.setMessage("Buffering...");
        this.progress.show();

    }
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    if (mediaPlayer != null) {
        mediaPlayer.reset();
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

इसके साथ थोड़ी समस्या है, अगर मैं अपना फोन लॉक कर देता हूं जबकि MediaPlayer खेल रहा है, तो जब मैं इसे अनलॉक करता हूं तो मेरा ऐप क्रैश हो जाता है।
सियारनका94

3
मैंने अभी-अभी onPause () में "MediaPlayer.release ()" लाइन पर टिप्पणी करने की कोशिश की है, और अब मेरा ऐप अनलॉक होने पर क्रैश नहीं होता है।
CiaranC94

@PiyushMishra ये सुविधा डेवलपर कंसोल द्वारा स्वीकार की जाती है? जैसा कि मेरे ऐप को खारिज कर दिया गया है b'coz मैंने Vitamio 4.x संस्करण का उपयोग किया है
पल्लवी

35

Android MediaPlayer मूल रूप से 2.2 तक एमपी 3 की स्ट्रीमिंग का समर्थन नहीं करता है। ओएस के पुराने संस्करणों में यह केवल 3GP को मूल रूप से स्ट्रीम करने के लिए प्रकट होता है। आप पॉकेटजोरनी कोड की कोशिश कर सकते हैं, हालांकि यह पुराना है (यहां एक नया संस्करण है ) और मुझे इसे चिपचिपा बनाने में परेशानी हुई थी - जब भी यह बफर को फिर से भरता है तो यह हकलाना होगा।

एंड्रॉइड के लिए एनपीआर न्यूज़ ऐप खुला स्रोत है और 2.2 से पहले ओएस के संस्करणों में एमपी 3 स्ट्रीमिंग को संभालने के लिए एक स्थानीय प्रॉक्सी सर्वर का उपयोग करता है। आप संबंधित कोड यहां 199-216 (r94) लाइनों में देख सकते हैं: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/ PlaybackService.java?r=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3

और यह StreamProxy वर्ग है: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java

NPR ऐप को अभी भी स्ट्रीमिंग के दौरान "त्रुटि (-38, 0)" कभी-कभी मिल रहा है। यह थ्रेडिंग समस्या या नेटवर्क परिवर्तन समस्या हो सकती है। अद्यतनों के लिए समस्या ट्रैकर की जाँच करें


क्या आपको इस पर पूरा यकीन है? मेरी समझ यह है कि यह माइम प्रकार के साथ करना था। क्या आप जांच सकते हैं कि क्या टी सही MIME टाइप प्री 2.1 के साथ काम करता है? मैं अभी कुछ और काम कर रहा हूं और कुछ समय तक जांच नहीं कर सका।
पंडालओवर

1
2.2 रिलीज़ नोट्स ( developer.android.com/sdk/android-2.2-highlights.html ) के अनुसार, इसमें "न्यू मीडिया फ्रेमवर्क (स्टेजफ्राइट) शामिल है जो स्थानीय फ़ाइल प्लेबैक और HTTP प्रगतिशील स्ट्रीमिंग का समर्थन करता है"। अपने सभी परीक्षण में मैं सीधे shoutcast सर्वर से स्ट्रीम करने के लिए 2.1 डिवाइस प्राप्त करने में असमर्थ था। मेरा मानना ​​है कि मुद्दा यह है कि shoutcast सर्वर HTTP / 1.1 के बजाय ICY / 1.1 का एक प्रोटोकॉल लौटाते हैं और मीडिया प्लेयर इस पर यात्रा करता है क्योंकि यह नहीं जानता कि उस सामग्री का जवाब कैसे दिया जाए।
jwadsack

@jwadsack क्या होगा अगर ऑडियो फ़ाइलों को एक बार डाउनलोड किया जाना चाहिए और उपयोगकर्ता ऑफ़लाइन भी फ़ाइलों को चला सकते हैं?
देवेन्द्र सिंह

@DevendraSingh मुझे नहीं पता कि आप फ़ाइल को सहेज सकते हैं जबकि यह वर्तमान मीडिया प्लेयर कार्यान्वयन के साथ स्ट्रीमिंग कर रहा है (यह उत्तर लगभग पांच साल पुराना है और 2.2 से बहुत बदल गया है)। यदि और कुछ नहीं है, तो आप इस उदाहरण के बाद एक प्रॉक्सी का निर्माण कर सकते हैं और फ़ाइल को स्टोरेज में लिख सकते हैं, जबकि आप इसे प्रॉक्सी से पास करते हैं।
जुवाडैक

11

मुझे लगता है कि आप एक .pls को सीधे या कुछ इसी तरह खेलने की कोशिश कर रहे हैं।

इसे आज़माएं:

1: कोड

mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3"));
mediaPlayer.start();

2: .pls फ़ाइल

यह URL एक उदाहरण के रूप में बीबीसी से है। यह एक .pls फ़ाइल थी जिसे linux पर मैंने डाउनलोड किया था

wget http://foo.bar/file.pls

और फिर मैंने विम के साथ खोला (अपने पसंदीदा संपादक का उपयोग करें?) और मैंने इस फ़ाइल के अंदर वास्तविक URL देखे हैं। दुर्भाग्य से, सभी .pls सादा पाठ की तरह नहीं होते हैं।

मैंने पढ़ा है कि 1.6 http से अधिक स्ट्रीमिंग एमपी 3 का समर्थन नहीं करेगा, लेकिन, मैंने अभी-अभी एंड्रॉइड 1.6 और 2.2 के साथ ओब्लॉक कोड का परीक्षण किया है और इसमें कोई समस्या नहीं है।

सौभाग्य!


7
याद रखें कि यदि आप संगीत को स्ट्रीम करना चाहते हैं, जिसे आपको mediaplayer.prepareAsync का उपयोग करना है, न कि mediaplayer.prepare का। इसलिए आप mediaplayer.create () का उपयोग नहीं कर सकते क्योंकि कोई भी .create () फ़ंक्शन आपके मीडिया प्लेयर ऑब्जेक्ट को सीधे तैयार किए गए राज्य में ले जाता है, जहाँ से आप तैयार करने के लिए तैयार करने के लिए तैयार करने के लिए तैयार नहीं है। developer.android.com/reference/android/media/MediaPlayer.html
marienke

4

उपयोग

 mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
 mediaplayer.prepareAsync();
 mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
      @Override
      public void onPrepared(MediaPlayer mp) {
          mediaplayer.start();
      }
 });

2

आपके पास मेरे पास एक ही त्रुटि है और यह पता चला है कि कोड में कुछ भी गलत नहीं था। समस्या यह थी कि वेबसर्वर गलत कंटेंट-टाइप हेडर भेज रहा था।

वेबसर्वर क्या सामग्री-प्रकार भेज रहा है यह देखने के लिए वायरशर्क या कुछ इसी तरह का प्रयास करें।


एमपी-फाइलों के लिए यह कंटेंट-टाइप होना चाहिए: ऑडियो / एमपीईजी
जिससे

1
आपने उस फ़ाइल को कैसे स्ट्रीम किया?
नौमान खालिद

2

मेरी परियोजनाओं की तलाश:

  1. https://github.com/master255/ImmortalPlayer http / FTP समर्थन, कैश डेटा को पढ़ने, भेजने और सहेजने के लिए एक धागा। सबसे सरल तरीका और सबसे तेज़ काम। जटिल तर्क - सबसे अच्छा तरीका है!
  2. https://github.com/master255/VideoViewCache कैश के साथ सरल वीडियोव्यू। खेलने और डेटा को बचाने के लिए दो सूत्र। बुरा तर्क, लेकिन अगर आपको जरूरत है तो इस का उपयोग करें।

1

शून्य राज्य i के लॉग से बचने के लिए OnPreparedListener के साथ mp.start को कॉल न करें।


मुझे अभी भी लॉग लाइन मिलती है 05-22 20: 26: 13.625: E / MediaPlayer (23818): स्टॉप स्टेट में 0 कहा जाता है, भले ही मैं तैयार () फ़ंक्शन में अपने मीडिया प्लेयर को शुरू करता हूं। मेरे पास एक ऑनर फ़ंक्शन भी है जहां मैं मीडिया प्लेयर ऑब्जेक्ट रीसेट करता हूं। मेरी स्ट्रीम शुरू होने में अभी भी 2 मिनट का समय लगता है। मेरा प्रश्न यहाँ देखें: stackoverflow.com/questions/16672568/…
marienke
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.