2010-07-09 12 views
12

Io uso MediaPlayer per la riproduzione di un singolo brano mp3 dalla rete. L'origine dati è un URL HTTP.MediaPlayer.seekTo() non funziona per la posizione senza buffer

Supponiamo di avere lo stato di riproduzione successivo.

durata del brano: 01:00

progresso attuale: 0:10

attuale progresso buffer 0:30

Diciamo che voglio saltare una parte di una canzone e cercare in avanti. Lo faccio con il metodo MediaPlayer.seekTo(). Se cerco di posizionare il buffer (0:20), viene eseguito correttamente. Ma se cerco una posizione che non è ancora stata memorizzata nel buffer (0:40), MediaPlayer si comporta in modo strano. Indica immediatamente che ha cercato correttamente senza attendere il riempimento del buffer. Infatti continua a suonare nella stessa posizione in cui era prima di cercare. D'ora in poi il metodo MediaPlayer.getCurrentPosition() restituisce una posizione errata. Quando la riproduzione raggiunge la sua fine e la chiamata OnCompletionListener.onCompletion è chiamata, la posizione corrente del lettore multimediale è molto più alta dell'intera durata della canzone.

Qualche idea per risolvere questo?

risposta

1

E 'probabilmente legato al bug che è (riferendosi a uno dei commenti) eventualmente fissato in 2,2 http://code.google.com/p/android/issues/detail?id=4124

+0

Grazie. Sembra essere la ragione. – plugmind

+0

sì, ci sono un paio di bug nel bug tracker relativo al lettore multimediale ....;) btw: se la risposta fosse disponibile, si prega di accettare la risposta (segno di spunta verde) –

+1

Questo bug è ancora applicabile a 2,2 Motorola Droid dispositivi, perché per qualsiasi motivo, usano ancora PVPlayer invece di stagefright/awesomeplayer. La migliore soluzione alternativa è la soluzione di jBilbo, o da scaricare e riprodurre da SD. – brack

3

E' stato risolto in Android 2.2 in alcuni dispositivi solo per quanto ne so.

Tuttavia Android 2.2 scombina con cercando di posistion tamponata. Sebbene una posizione sia già presente nel buffer, MediaPlayer invia una richiesta a un server.

3

ho trovato una soluzione per questo problema:

Prima si crea un OnBufferingUpdateListener:

MediaPlayer.OnBufferingUpdateListener bufferingListener = new MediaPlayer.OnBufferingUpdateListener() { 
    public void onBufferingUpdate(MediaPlayer mp, int percent) { 
     //code to increase your secondary seekbar 
    } 
}; 

Poi, nel vostro evento SeekBar onProgressChanged effettuare le seguenti operazioni:

public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 
    int secondaryPosition = seekBar.getSecondaryProgress(); 
    if (progress > secondaryPosition) 
     seekBar.setProgress(secondaryPosition); 
} 

Con questo si garantisce l'utente non può trascinare la barra di avanzamento su una posizione senza buffer (e anche vedere cosa è memorizzato nel buffer).

+0

Già fatto in modo simile. Grazie comunque. – plugmind

Problemi correlati