0

URLが曲ごとに変わるリモート音楽ストリームがあります。
曲が終わるたびにメディア プレーヤーの準備を待つ必要はありません。
これを実装するための私のアイデアは、2 つのメディア プレーヤー インスタンスを作成し、もう一方のメディア プレーヤーの再生中に次の曲をロードし、曲の終了時にそれらを切り替えて、再生を停止した側で次の曲を準備することでした。

これを行うことがベストプラクティスなのか、それともこれを達成する別の方法があるのか​​ 疑問に思っていました.

4

1 に答える 1

1

参考までに、私は次のようにしました。

    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 を拡張し、プリロードの準備ができている (またはプリロードが完了して準備ができている) かどうかを知るためにいくつかのフラグを追加する必要があります。

しかし、これはあなたにアイデアを与えるはずです。

完了したら、メディアプレーヤーでリセット/リリースを呼び出して、すべてを解放することを忘れないでください。

于 2013-10-31T19:14:43.693 に答える