Android MediaPlayer sta preparando troppo lungo
-
10-10-2019 - |
Domanda
Hey, Sto usando MediaPlayer per riprodurre un flusso ShoutCast regolare. Il codice è semplice con prepareAsync () e un gestore per avviare la riproduzione. Mentre funziona perfettamente con alcuni corsi d'acqua come DI.FM o ETN.FM (http://u10.di.fm:80/di_progressive), con gli altri (http://mp3.wpsu.org:8000/) ha vinto' t andare oltre lo stato di preparazione. No altri ascoltatori sono chiamati sia.
//Uri streamUri = Uri.parse("http://u10.di.fm:80/di_progressive"); /* works */
Uri streamUri = Uri.parse("http://mp3.wpsu.org:8000/"); /* stuck on prepare state */
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(this.getBaseContext(), streamUri);
mediaPlayer.prepareAsync();
Qualsiasi commento è apprezzato!
Soluzione
Credo che ci sono alcuni problemi di compatibilità con la fine del server. Questo è piuttosto strano dato che le maniglie emulatore è ok nel mio caso -. Semplicemente non sul mio Galaxy S Froyo, anche se è la stessa versione API
Potrebbe essere un problema di codec, http streaming di problema, non lo so. Ma tutti i server che non riescono tendono a essere quelli vecchi, con "Copyright 1998-2004". In basso ... Non esattamente recenti o aggiornate si potrebbe pensare
Una soluzione potenziale (che non ho ancora provato) sarebbe quella di utilizzare il StreamProxy , che sarebbe anche rendere il codice compatibile con 2.1 e versioni precedenti, eventualmente, anche. A costo di lavoro extra, codice extra, e senza dubbio più bug ...
Nel caso in cui non si è a conoscenza di esso, v'è un altro rapporto giocatore bug per il 2.2 che può essere rilevante anche: opere base di streaming audio a 2.1, ma non a 2.2
Altri suggerimenti
Sto affrontando un problema quando MP "si blocca" a preparare stato troppo a lungo (flusso) e sto cercando di fermarla con reset (). Questo fa sì che MP per appendere e quindi tutto il mio congela app. Sembra che non v'è alcun modo per fermare MP a preparare Stato. Im pensando sull'uso preparare () avvolto in discussione, invece di prepareAsync (). Allora sarò in grado di uccidere quel filo. Come per ora l'ho fatto in questo modo:
private void actionCancel(){
try {
mp.setDataSource(new String());
} catch (Exception e) {
e.printStackTrace();
android.util.Log.d(TAG,"actionCancel(): mp.setDataSource() exception");
mp.reset();
}
}
e funziona 4me.
Inoltre ho un contatore seguente:
@Override
public void onBufferingUpdate(final MediaPlayer mp, final int percent) {
if (!mp.isPlaying()){
// android.util.Log.d(TAG,"onBufferingUpdate(): onBufferingUpdateCount = "+onBufferingUpdateCount);
if (onBufferingUpdateCount>MAX_BUFFERING_UPDATES_AT_PREPARING_STATE)
restartMP();
onBufferingUpdateCount++;
return;
}
}
Mi piacerebbe scoprire questo ascoltatore innesca sempre a preparare Stato. Quindi, se si innesca più di 10 volte e MP non è ancora in gioco sto solo riavviarlo:
private void restartMP(){
if (mp!=null)
if (mpState==MediaPlayerState.Preparing)
actionCancel();
else
mp.reset();
else
mp = new MediaPlayer();
mpState = MediaPlayerState.Idle;
onBufferingUpdateCount=0;
//isRequestCancelled=false;
requestTrackInfoStartedAt=0;
requestPlay();
}
Nota MediaPlayerState è il mio enum personalizzato che ha un valore "Preparazione". Anche mpState è una struttura / campo di classe che mantiene lo stato MediaPlayerState corrente. Prima di iniziare prepareAsync () im impostazione mpState per MediaPlayerState.Preparing dopo aver completato im impostazione per MediaPlayerState.Started o altro valore corrispondente.