安卓媒体播放器无限缓冲

7

我正在开发 Android 上的在线流媒体播放器。我发现 MediaPlayer 永远不会停止缓冲!它读取了缓冲区的 100% 并继续执行“某些”操作,因为流只能被读取一次,并且没有剩余的内容可以缓冲...

public void onBufferingUpdate(MediaPlayer player, int percent)

当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
...

你有解决这个问题吗?我正在开发一个应用程序,其中通过MediaPlayer在服务中播放视频。但是我发现即使在手机屏幕关闭并处于睡眠状态时,“暂停”视频仍会耗费电量!停止和重置MediaPlayer似乎已经解决了这个问题,但如果需要重新初始化播放器,则恢复播放需要更长时间,因此最好还是能够保持视频暂停状态。 - Flyview
我发现这种情况只在我的华为手机上出现(至少我测试过的其他设备都能正常工作)。最终,我这样做了:如果播放器暂停一段时间并且正在缓冲,则重置播放器。 - Arvydas
2个回答

2
首先,不建议在不使用MediaPlayer时将其保持暂停状态。虽然有时候可能会有效,但最终Android系统会收回这些资源。如果您的应用程序处于非活跃状态时不进行清理,那么这样做就不太好。
话虽如此,我认为它正在与服务器建立一个开放的套接字,可能会在每次ping操作时发送缓冲通知以确保套接字仍然处于开放状态。HTTP流媒体协议过于简单,无法满足您的要求。但是,您至少有一种方法可以使其工作。您可以插入一个代理,允许您同时缓存流媒体并进行播放。当用户在流媒体尚未完全缓存时退出应用程序时,您需要聪明地处理所发生的情况,但它可以工作。此时,MediaPlayer被降级为本地文件播放,当再次打开应用程序时,您可以停止和定位到正确的点。这提供了更好地管理资源和网络通信的手段。

0

试试这个。按下返回键时,它将结束媒体播放器。

@Override
public void onBackPressed() {

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

}

重点是我不想重置媒体播放器。期望的行为是:用户播放曲目->按暂停->离开应用程序->几个小时后回来->继续播放。 - Arvydas
mp.pause(); 可能已经足够了。 - Carnage
pause()函数确实有效,并且我得到了期望的行为,但是如果我调用pause()函数,mediaplayer会继续'缓冲'并消耗电池。如果我重置mp,无尽的缓冲就会停止,但是我将无法继续播放。如果缓冲在达到100%时停止,那就太完美了,但是由于某种神奇的原因,它并没有停止。我正在寻找一种不重置mediaplayer的好方法来停止缓冲。 - Arvydas
2
保存MP所在的位置,当用户返回时,使用SeekTo返回到该位置。 - Martin Marconcini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接