2015-01-19 13 views
6

Ho un oggetto mediaplayer abbastanza standard che si avvia in onCreate e loop per musica di sottofondo nella mia app. Il file non è insolitamente grande, è un MP3 da 6MB. Dal onCreate:Mediaplayer Android problemi audio/balbuzie solo sui dispositivi più recenti

MediaPlayer mp; 
mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity); 
mp.setLooping(true); 
mp.setVolume(0.4f, 0.4f); 
mp.start(); 

Questo funziona bene sulla maggior parte dei miei dispositivi di test, tra cui i telefoni più vecchi, un Samsung Galaxy Tab tablet 2 10" , e anche un Nexus 4.

problemi Purtroppo, sto sperimentando esclusivamente con dispositivi più recenti in cui si verificano problemi di glitching/stuttering audio sul Nexus 5 e sul nuovo Nexus 10. Questi problemi si verificano SOLO su dispositivi più recenti, in genere dopo alcuni secondi di riproduzione corretta, non immediatamente Entrambi i miei Nexus 4 e 5 sono in esecuzione Android 4.4.4 e tuttavia il problema si verifica solo sul Nexus 5.

Questo problema sembra essere esasperato it Metto in pausa l'oggetto di un mediaplayer e ne suono uno diverso per un breve periodo di tempo (musica di battaglia per brevi combattimenti nel gioco), ma il problema si verifica anche senza questa ulteriore complicazione.

Ho letto che le versioni più recenti di Android hanno causato problemi con Mediaplayer, ma non ho trovato una soluzione o un suggerimento.

Qualcun altro ha riscontrato questo problema che può suggerire una soluzione o una soluzione? Grazie per il tuo tempo!

+0

Hai trovato qualche soluzione per questo problema? –

+0

No, sfortunatamente. – regomar

risposta

0

Ho notato che questo accada anche sui miei dispositivi Android.

Ho notato che non stai chiamando Prepare(), che è una funzione importante prima di riprodurre l'audio. MODIFICA-- una chiamata da preparare è necessaria solo quando si crea MediaPlayer usando nuovo, non con MediaPlayer.Create() incorporato.

Per quanto riguarda il problema quando si passa da una fonte all'altra, suggerisco di effettuare una chiamata a SeekTo() l'ora esatta nell'audio che si desidera riprodurre e attendere quella posizione con il listener SeekComplete. Nei commenti, ho una piccola riga di codice hacky che non imposta il volume su mediaPlayer fino a dopo la chiamata per iniziare. Questo sembra ridurre la balbuzie, ma potresti perdere la prima piccola parte dell'audio.

Sto utilizzando Xamarin Studio C#, ma anche se si sta utilizzando Java, lo stesso approccio dovrebbe funzionare.

MediaPlayer mediaPlayer = new MediaPlayer(); 
mediaPlayer.SetAudioStreamType (Android.Media.Stream.Music); 
mediaPlayer.SetDataSource ("dataSourcePath"); 

mediaPlayer.Looping = true; 

//It is necessary to call prepare after setting the data source 
mediaPlayer.Prepare(); 

//Ensure the audio has seeked to the position you need 
bool seekingComplete = false; 
mediaPlayer.SeekComplete += (object sender, EventArgs e) => { 
    seekingComplete = true; 
}; 

mediaPlayer.SeekTo(0); 

//Forces the audio to complete seeking 
while(seekingComplete == false) 
{ 
    //Here, you just wait 2 milliseconds at a time 
    //for this buffering and seeking to complete 
    await Task.Delay(2); 
} 

mediaPlayer.Start(); 

//Hacky way to prevent the glitch sound at the start is to set the 
//volume after calling start 
//mediaPlayer.SetVolume(0.4f, 0.4f); 
+0

La chiamata 'MediaPlayer.create()' prepara automaticamente l'audio. Sicuramente non dovresti chiamarlo di nuovo. Dalla documentazione: "Metodo pratico per creare un MediaPlayer per un dato Uri In caso di successo, preparare() sarà già sono stati chiamati e non deve essere chiamato di nuovo." –

Problemi correlati