我有一个远程音乐流,其中 url 会更改每首歌曲。
我不希望用户在每次歌曲结束时等待媒体播放器准备。
我实现这一点的想法是创建两个媒体播放器实例,并在另一个媒体播放器播放期间加载下一首歌曲,当歌曲结束时在它们之间切换并在停止播放的歌曲上准备下一首歌曲。
我想知道这样做是否是最佳做法,还是有其他方法可以实现这一点。
我有一个远程音乐流,其中 url 会更改每首歌曲。
我不希望用户在每次歌曲结束时等待媒体播放器准备。
我实现这一点的想法是创建两个媒体播放器实例,并在另一个媒体播放器播放期间加载下一首歌曲,当歌曲结束时在它们之间切换并在停止播放的歌曲上准备下一首歌曲。
我想知道这样做是否是最佳做法,还是有其他方法可以实现这一点。
仅供参考,我已经这样做了:
public MediaPlayer[] mediaPlayers;
public MediaPlayer currentMediaPlayer;
public MediaPlayer preloadMediaPlayer;
你可以初始化它们:
private void initMediaPlayers() {
mediaPlayers = new MediaPlayer[MEDIA_PLAYER_COUNT];
mediaPlayers[0] = createMediaPlayer();
mediaPlayers[1] = createMediaPlayer();
currentMediaPlayer = mediaPlayers[0];
preloadMediaPlayer = mediaPlayers[1];
currentPlayerIndex = 0;
}
createMediaPlayer 只是一个辅助方法:
private MediaPlayer createMediaPlayer() {
final MediaPlayer smp = new MediaPlayer();
smp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
//TODO: add your code here
}
});
smp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
//TODO: add your own error handling
return true;
}
});
//TODO: add anything else you need
return smp;
}
然后如果你想交换球员:
private void swapPlayers() {
if (currentPlayerIndex == 0) {
currentMediaPlayer = mediaPlayers[1];
preloadMediaPlayer = mediaPlayers[0];
currentPlayerIndex = 1;
} else if (currentPlayerIndex == 1) {
currentMediaPlayer = mediaPlayers[0];
preloadMediaPlayer = mediaPlayers[1];
currentPlayerIndex = 0;
}
}
这是一个简化版本,您可能想要扩展 MediaPlayer 并添加一些标志来了解您是否准备好预加载(或完成预加载并且您准备好了)等。
但这应该给你的想法。
完成后不要忘记通过在媒体播放器中调用 reset/release 来释放所有内容。