2015-01-19 8 views
6

Ich habe ein ziemlich Standard-Mediaplayer-Objekt, das in OnCreate und Loops für Hintergrundmusik in meiner App startet. Die Datei ist nicht ungewöhnlich groß, es ist ein 6MB MP3. Vom onCreate:Android Mediaplayer Audio Störungen/Stotter nur auf neueren Geräten

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

Das auf die meisten meiner Testgeräte einschließlich älteren Handys funktioniert gut, ein Samsung Galaxy Tab 2 Tablette 10" und sogar ein Nexus 4.

Leider habe ich habe Probleme Ausschließlich mit neueren Geräten, bei denen ich auf dem Nexus 5 und dem neueren Nexus 10 auf Störgeräusche stottere Diese Probleme treten NUR auf neueren Geräten auf, normalerweise nach ein paar Sekunden richtiger Wiedergabe, nicht sofort Sowohl mein Nexus 4 als auch 5 laufen mit Android 4.4.4 und doch tritt das Problem nur auf dem Nexus 5 auf.

Dieses Problem scheint sich zu verschärfen wh de Ich halte das Mediaplayerobjekt an und spiele kurzzeitig ein anderes (Kampfmusik für kurze Kämpfe im Spiel), aber das Glitching passiert auch ohne diese zusätzliche Komplikation.

Ich habe gelesen, dass neuere Versionen von Android Probleme mit Mediaplayer verursacht haben, aber ich bin nicht auf eine Lösung oder einen Vorschlag gekommen.

Hat noch jemand dieses Problem erfahren, der eine Fehlerbehebung oder eine Problemumgehung vorschlagen kann? Vielen Dank für Ihre Zeit!

+0

Haben Sie eine Lösung für dieses Problem gefunden? –

+0

Nein, leider. – regomar

Antwort

0

Ich habe festgestellt, dass dies auch auf meinen Android-Geräten passiert.

Ich bemerke, dass Sie Prepare() nicht aufrufen, was eine wichtige Funktion vor dem Abspielen von Audio ist. EDIT-- Ein Aufruf zum Vorbereiten ist nur erforderlich, wenn MediaPlayer mit new erstellt wird, nicht mit dem integrierten MediaPlayer.Create().

Was Ihr Problem beim Wechseln zwischen Quellen betrifft, schlage ich vor, SeekTo() die genaue Zeit in der Audiowiedergabe aufzurufen, die Sie wiedergeben möchten, und mit dem SeekComplete-Listener auf diese Position zu warten. In Kommentaren habe ich eine kleine Zeile mit Hacky-Code, der die Lautstärke auf dem MediaPlayer erst nach dem Aufruf zum Starten setzt. Dies scheint das Stottern zu reduzieren, aber Sie könnten den ersten kleinen Teil des Audiomaterials verlieren.

Ich verwende Xamarin Studio C#, aber selbst wenn Sie Java verwenden, sollte der gleiche Ansatz funktionieren.

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

Durch den Aufruf von 'MediaPlayer.create()' wird das Audio automatisch vorbereitet. Du solltest es auf keinen Fall nochmal anrufen. Aus der Dokumentation: „Convenience-Methode einen Mediaplayer für einen bestimmten Uri zu schaffen, auf Erfolg, prepare() bereits genannt wurde, und muß nicht noch einmal genannt werden.“ –

Verwandte Themen