【问题标题】:Mediaplayer stream online MP3 fileMediaplayer 在线播放 MP3 文件
【发布时间】:2013-03-24 10:25:07
【问题描述】:

我有一个 Android 应用程序可以流式传输 MP3 文件并在播放器中播放该文件, 但问题是mediaPlayer.prepare(); 需要很长时间缓冲并且应用程序冻结 所以我尝试使用prepareAsync();,但是使用这个功能我无法让播放器播放下一个文件。

它只是在线播放一个文件;如果我需要播放另一个文件,我必须在播放结束时关闭并重新启动活动。这是我的代码:

public void playMp3(String _link)
{
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {
        if(!mediaPlayer.isPlaying()){
        mediaPlayer.start();
        Progressbar.setVisibility(View.INVISIBLE);
        play.setVisibility(View.GONE);
        stop.setVisibility(View.VISIBLE);
        songProgressBar.setProgress(0);
        songProgressBar.setMax(100);
        }
        updateProgressBar();      
    }
});
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mediaPlayer.reset();
        songProgressBar.setProgress(0);
        songProgressBar.setSecondaryProgress(0);
        play.setVisibility(View.VISIBLE);
        stop.setVisibility(View.GONE);
        link = "http://server11.mp3quran.net/hawashi/002.mp3";
        playMp3(link);

    }
});
mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
       // Toast.makeText(getApplicationContext(), "n" + percent, Toast.LENGTH_LONG).show();
        songProgressBar.setSecondaryProgress(percent);

         if(percent==100)
         {
             Progressbar.setVisibility(View.INVISIBLE);

         }else if(percent > songProgressBar.getProgress())
         {
             Progressbar.setVisibility(View.INVISIBLE);
         }else
         {
             Progressbar.setVisibility(View.VISIBLE);
         }

    }
});

mediaPlayer.reset();
Progressbar.setVisibility(View.VISIBLE);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

try {
    mediaPlayer.setDataSource(_link);
    //mediaPlayer.prepare(); // might take long! (for buffering, etc)   //@@
    mediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalStateException e) {
    // TODO Auto-generated catch block///
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}}

【问题讨论】:

    标签: android stream android-music-player


    【解决方案1】:

    实际上我不知道你的代码哪里出错了,但我会解释我是如何在我的应用程序中做到这一点的

    public void playMp3(String _link){
    
                    mediaPlayer.reset();
                    Progressbar.setVisibility(View.VISIBLE);
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
                try {
                    mediaPlayer.setDataSource(_link);
                    mediaPlayer.setOnBufferingUpdateListener(this);
                    mediaPlayer.setOnPreparedListener(this);
                    //mediaPlayer.prepare(); // might take long! (for buffering, etc)   //@@
                    mediaPlayer.prepareAsync();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block///
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    

    然后在你的类中实现 OnCompletionListener、OnPreparedListener 和 OnBufferingUpdateListener

    public class PlayerActivity extends Activity implements OnCompletionListener, OnPreparedListener, OnBufferingUpdateListener{
    .
    .
    .
    

    并实现所有方法

    public void onPrepared(MediaPlayer mediaplayer) {
        if(!mediaPlayer.isPlaying()){
            mediaPlayer.start();
            Progressbar.setVisibility(View.INVISIBLE);
            play.setVisibility(View.GONE);
            stop.setVisibility(View.VISIBLE);
            songProgressBar.setProgress(0);
            songProgressBar.setMax(100);
            }
            updateProgressBar();      
    }
    
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        //mediaPlayer.reset();
            songProgressBar.setProgress(0);
            songProgressBar.setSecondaryProgress(0);
            play.setVisibility(View.VISIBLE);
            stop.setVisibility(View.GONE);
            link = "http://server11.mp3quran.net/hawashi/002.mp3";
            playMp3(link);
    }
    
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
         songProgressBar.setSecondaryProgress(percent);
    
             if(percent==100)
             {
                 Progressbar.setVisibility(View.INVISIBLE);
    
             }else if(percent > songProgressBar.getProgress())
             {
                 Progressbar.setVisibility(View.INVISIBLE);
             }else
             {
                 Progressbar.setVisibility(View.VISIBLE);
             }
    }
    

    我希望这对你有所帮助。

    【讨论】:

    • 谢谢你这项工作与我完美,我忘记检查 mediaPlayer.isPlaying :) onPrepared
    • 这用于流媒体 url(RTSP (RTP, SDP) HTTP/HTTPS 渐进式流媒体),或者我可以将它用于任何 mp3 下载 url?假设我有直接下载 url blabla.com/example.mp3 (如果我们把这个 url 放在 firefox 中它会下载)
    • 这段代码有点问题。 mediaPlayer 只播放我的 ArrayList 中的第一个文件。播放第一个文件后,将多次调用 onCompletionListener(无休止)
    • @AwadKab 你是如何设计你的前端的,你可以和我们分享一下,这对他们所有人检查代码都有帮助
    • 如何将刚刚缓冲的流保存到文件中?无论如何只能用这个库来做这个吗?还是我需要单独下载?
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多