2013-10-30 3 views
7

Sto sviluppando un lettore di streaming online su Android. Ho scoperto che il mediaplayer non smetterà mai di buffering! Si legge il 100% di buffer e continua a fare 'qualcosa', perché flusso può essere letto solo una sola volta e non c'è più niente da tamponare ... Vedo cheBuffer infinito mediaplayer Android

public void onBufferingUpdate(MediaPlayer player, int percent) 

si chiama all'infinito con cento = 100. scarica la batteria per una notte. Sto facendo qualcosa di sbagliato o c'è qualche spiegazione ragionevole su questo? Sembra che il buffering non possa essere annullato, l'unico modo per fermarlo è resettare il mediaplayer stesso. Ho bisogno di un modo per fermare questo interminabile "buffering"!

questo come ho init MediaPlayer

mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mMediaPlayer.setDataSource(streamUrl); 
mMediaPlayer.setOnBufferingUpdateListener(this); 
mMediaPlayer.setOnInfoListener(this); 
mMediaPlayer.setOnPreparedListener(this); 
mMediaPlayer.setOnErrorListener(this); 
mMediaPlayer.prepareAsync(); 

Messaggi di log che vedo:

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

Hai mai capito qualcosa? Sto sviluppando un'applicazione in cui un video viene riprodotto attraverso un MediaPlayer in un servizio e mi sono reso conto che dopo averlo lasciato "in pausa" stava scaricando la batteria anche quando il telefono è spento e si suppone dorma! Fermare e reimpostare MediaPlayer sembra averlo risolto, ma sarebbe comunque preferibile se fosse possibile lasciarlo in pausa, poiché è necessario più tempo per riprendere se devo reinizializzare il lettore. – Flyview

+0

Ho capito che si comportava così solo sul mio telefono Huawei (almeno qualsiasi altro dispositivo testato funzionava correttamente). Alla fine l'ho fatto così: se il giocatore è in pausa da un po 'di tempo e sta facendo il buffering, allora resetto il giocatore. – Arvydas

risposta

0

provare questo. Questo finirà il lettore multimediale quando si preme indietro.

@Override 
public void onBackPressed() { 

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

} 
+0

Il punto è che non voglio ripristinare il mediaplayer. Comportamento desiderato: l'utente riproduce il brano -> Premi pausa -> Lascia app -> Ritorna in poche ore -> continua a giocare. – Arvydas

+0

mp.pause(); potrebbe essere sufficiente – Carnage

+0

Well pause() funziona e ottengo questo comportamento desiderato, tranne che il mediaplayer continua a 'buffering' e scarica la batteria se faccio una pausa(). Se resetto mp, il buffering infinito si arresta, MA non sarò in grado di continuare a giocare. Sarebbe perfetto se il buffering si fermasse quando raggiunge il 100%, ma non lo fa (per qualche ragione magica ...). Sto cercando un modo piacevole per interrompere il buffering senza reimpostare il mediaplayer. – Arvydas

2

In primo luogo, non è una buona idea lasciare il MediaPlayer pausa mentre non in uso. A volte può funzionare, ma Android recupererà queste risorse alla fine. È semplicemente una cattiva pratica non ripulire quando la tua app non è attiva.

Detto questo, credo che ciò che sta facendo sia mantenere un socket aperto con il server, probabilmente inviando la notifica di buffering ogni volta che esegue il ping per assicurarsi che il socket sia ancora aperto. Lo streaming HTTP è un protocollo troppo semplice per fare ciò che chiedi. Ma hai almeno un'opzione per farlo funzionare. È possibile inserire un proxy che consentirà di memorizzare nello stream e riprodurre simultaneamente. Dovrai essere intelligente nel gestire ciò che accade quando l'utente esce prima che lo stream sia completamente memorizzato nella cache, ma può funzionare. A quel punto, MediaPlayer viene ridotto alla riproduzione del file locale, che puoi interrompere e cercare nel punto corretto quando l'app viene riaperta. Fornisce un mezzo per gestire meglio le risorse e la comunicazione di rete.