7

Android でオンライン ストリーミング プレーヤーを開発しています。mediaplayer がバッファリングを停止しないことがわかりました。ストリームは一度しか読み取れず、バッファするものが残っていないため、バッファの 100% を読み取り、「何か」を実行し続けます...

public void onBufferingUpdate(MediaPlayer player, int percent)

パーセント= 100で際限なく呼び出されます。これは、一晩でバッテリーを消耗します。私は何か間違ったことをしていますか、それともこれについて合理的な説明がありますか? バッファリングをキャンセルすることはできないようです。それを停止する唯一の方法は、mediaplayer 自体をリセットすることです。この終わりのない「バッファリング」を止める方法が必要です!

これは私がメディアプレーヤーを初期化する方法です

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 ストリーミングは単純すぎるプロトコルであり、要求を実行することはできません。ただし、それを機能させるためのオプションが少なくとも 1 つあります。ストリームと再生を同時にキャッシュできるようにするプロキシを挿入できます。ストリームが完全にキャッシュされる前にユーザーが終了したときに何が起こるかについては、賢く対処する必要がありますが、うまくいく可能性があります。その時点で、MediaPlayer はローカル ファイルの再生に縮小されます。これを停止して、アプリを再度開いたときに正しいポイントを探すことができます。リソースとネットワーク通信をより適切に管理する手段を提供します。

于 2013-10-31T00:46:43.890 に答える