2013-10-30 13 views
7

私はAndroid上でオンラインストリーミングプレーヤーを開発しています。私はメディアプレイヤーがこれまでバッファリングを止めていないことに気づきました!これは、バッファの100%を読み取り、「何か」をやって維持し、ストリームだけ一度しか読むことができないので、そこは何もバッファリングするために残っていない...私はAndroid mediaplayerエンドレスバッファリング

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(); 

ログメッセージのinitどの

この:

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 
... 
+0

これまでに何かを見つけましたか?私は、ビデオがMediaPlayerを通じてサービスで再生されるアプリケーションを開発しています。そして、それを放置した後、電話が画面を消していて、眠っているときでも、バッテリーが消耗していたことに気付きました! MediaPlayerの停止とリセットはそれを修正したようですが、プレーヤーを再初期化する必要がある場合は、再開するのに時間がかかりますので、一時停止のままにしておくことができればさらに好ましいでしょう。 – Flyview

+0

私はHuaweiの携帯電話(少なくとも私がテストした他のどのデバイスも正常に動作していました)だけで、このように動作することを理解しました。最終的に私はこのようにしました。プレイヤーがしばらくの間ポーズをとり、バッファリングしている場合、プレイヤーをリセットします。 – Arvydas

答えて

0

はこれを試してみてください。これは、メディアプレーヤーを押したときに終了します。

@Override 
public void onBackPressed() { 

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

} 
+0

ポイントはmediaplayerをリセットしたくないということです。必要な動作:ユーザーがトラックを再生 - >一時停止を押す - >アプリを放す - >数時間後に戻る - >再生を続けます。 – Arvydas

+0

mp.pause();十分かもしれない。 – Carnage

+0

pause()がうまくいけば、mediaplayerが 'バッファリング'を保持し、pause()を実行するとバッテリーが消耗します。 mpをリセットすると、無限のバッファリングは停止しますが、再生を続けることはできません。バッファリングが100%に達したときにバッファリングが止まるのであれば完璧ですが、それは(いくつかの魔法の理由のために...)。私はメディアプレーヤーをリセットせずにバッファリングを止める良い方法を探しています。 – Arvydas

2

まず、使用していない状態でMediaPlayerを一時停止状態にしておくことはお勧めできません。時にはうまくいくかもしれませんが、Androidは最終的にこれらのリソースを取り戻すつもりです。あなたのアプリがアクティブでないときにクリーンアップしないことは、単に悪い習慣です。

つまり、私はそれが何をしているのかは、ソケットがまだ開いていることを確認するためにpingするたびに、おそらくバッファリング通知を送信して、サーバーとオープンソケットを維持することだと考えています。 HTTPストリーミングは、あなたが求めていることをするためのプロトコルが単純すぎます。しかし、それを機能させるには少なくとも1つの選択肢があります。プロキシを挿入すると、ストリームと再生を同時にキャッシュすることができます。ストリームが完全にキャッシュされる前にユーザーが終了したときに何が起こるのかを賢明に扱う必要がありますが、それは機能します。その時点で、MediaPlayerはローカルファイルの再生に縮小され、アプリケーションを再び開いたときに停止して正しい位置に移動することができます。リソースとネットワーク通信をよりよく管理する手段を提供します。

関連する問題