7

我正在 Android 上开发在线流媒体播放器。我发现媒体播放器永远不会停止缓冲!它读取 100% 的缓冲区并继续做“某事”,因为流只能被读取一次,并且没有任何东西可以缓冲......我明白了

public void onBufferingUpdate(MediaPlayer player, int percent)

以百分比 = 100 无休止地调用。它会在一晚内耗尽电池电量。我做错了什么还是对此有一些合理的解释?似乎无法取消缓冲,停止它的唯一方法是重置媒体播放器本身。我需要一些方法来阻止这种无休止的“缓冲”!

这就是我初始化媒体播放器的方式

mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource(streamUrl);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.prepareAsync();

我看到的日志消息:

10-30 08:45:21.169: D/MediaPlayer(13217): Message: MEDIA_BUFFERING_UPDATE(3), ext1=93, ext2=0x0
10-30 08:45:22.169: D/MediaPlayer(13217): Message: MEDIA_BUFFERING_UPDATE(3), ext1=100, ext2=0x0
10-30 08:45:23.169: D/MediaPlayer(13217): Message: MEDIA_BUFFERING_UPDATE(3), ext1=100, ext2=0x0
10-30 08:45:24.172: D/MediaPlayer(13217): Message: MEDIA_BUFFERING_UPDATE(3), ext1=100, ext2=0x0
10-30 08:45:25.172: D/MediaPlayer(13217): Message: MEDIA_BUFFERING_UPDATE(3), ext1=100, ext2=0x0
...
4

2 回答 2

2

首先,让 MediaPlayer 在不使用时暂停不是一个好主意。它有时可能会起作用,但 Android 最终会收回这些资源。当您的应用程序未处于活动状态时,不进行清理是一种不好的做法。

也就是说,我相信它正在做的是与服务器保持一个打开的套接字,可能会在它发出 ping 时发送缓冲通知以确保套接字仍然打开。HTTP 流是一种过于简单的协议,无法满足您的要求。但是您至少有一种选择可以让它发挥作用。您可以插入允许您同时缓存流和播放的代理。您必须巧妙地处理用户在流完全缓存之前退出时发生的情况,但它可以工作。那时,MediaPlayer 被简化为本地文件播放,您可以在再次打开应用程序时停止并寻找正确的点。它提供了一种更好地管理资源和网络通信的方法。

于 2013-10-31T00:46:43.890 回答
0

尝试这个。这将在按下返回时结束媒体播放器。

@Override
public void onBackPressed() {

    mp.stop();
    mp.reset();
            this.finish();

}
于 2013-10-30T07:31:55.430 回答