2017-08-29 2 views
10

Ich habe ein merkwürdiges Verhalten während des Streams von Musik auf einigen Geräten. Wenn das Audio zuerst abgespielt wird, springt die Position umher und spielt unregelmäßig, bis die Pufferung vollständig abgeschlossen ist.Android MediaPlayer - Position springt beim Puffern umher

Ich begann mit der sample code from Tutorials Point. Ich schaffe Mediaplayer in OnCreate() als solche:

// Create Media Player 
mediaPlayer = new MediaPlayer(); 
mediaPlayer.setOnBufferingUpdateListener(this); 
mediaPlayer.reset(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
prepareMediaPlayer(); 

prepareMediaPlayer die Daten wie folgt setzt:

private void prepareMediaPlayer() { 

    try { 
     mediaPlayer.setDataSource(myurl); 
     mediaPlayer.prepareAsync(); 
     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       Toast.makeText(getApplicationContext(), 
         "Playing sound",Toast.LENGTH_SHORT).show(); 

       mediaPlayer.start(); 

      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

und onBufferingUpdate druckt den Puffer Fortschritt:

@Override 
public void onBufferingUpdate(MediaPlayer mediaPlayer, int bufferingProgress) { 
    Log.v(TAG, "onBufferingUpdate() "+bufferingProgress + 
      "\ncurrentposition: "+mediaPlayer.getCurrentPosition()); 

    seekbar.setSecondaryProgress(bufferingProgress); 
} 

Und die Protokollausgabe Ich bekomme Shows, wie die Position springt, während der Mediaplayer noch puffert. Ich habe auf ein paar Geräten getestet, und das passiert nur auf einem Moto G. Ist das ein Fehler in der Firmware oder mache ich etwas falsch?

08-29 12:50:17.934 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 4 
                       currentposition: 0 
08-29 12:50:17.934 277/com.test.mediaplayer D/MediaPlayer: setSubtitleAnchor in MediaPlayer 
08-29 12:50:17.976 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 4 
                       currentposition: 0 
08-29 12:50:18.014 27927-27945/com.test.mediaplayer V/RenderScript: 0xb7912ee8 Launching thread(s), CPUs 4 
08-29 12:50:21.414 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 8 
                       currentposition: 7 
08-29 12:50:34.930 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 11 
                       currentposition: 9 
08-29 12:50:50.085 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 15 
                       currentposition: 4 
08-29 12:51:32.991 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 19 
                       currentposition: 2 
08-29 12:53:25.036 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 22 
                       currentposition: 5 
08-29 12:53:51.976 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 26 
                       currentposition: 1 
08-29 12:56:26.004 27927-27946/com.test.mediaplayer I/MediaHTTPConnection: proxyName: 0.0.0.0 0 
08-29 12:56:34.651 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 30 
                       currentposition: 10 
08-29 12:56:35.862 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 33 
                       currentposition: 1102 
08-29 12:56:38.211 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 37 
                       currentposition: 4 
08-29 12:56:40.097 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 41 
                       currentposition: 9 
08-29 12:56:43.034 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 44 
                       currentposition: 9 
08-29 12:56:45.130 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 48 
                       currentposition: 3 
08-29 12:56:49.841 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 52 
                       currentposition: 8 
08-29 12:56:52.500 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 55 
                       currentposition: 8 
08-29 12:56:55.748 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 63 
                       currentposition: 7 
08-29 12:56:57.080 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 74 
                       currentposition: 1223 
08-29 12:56:59.072 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 81 
                       currentposition: 979 
08-29 12:57:00.073 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 81 
                       currentposition: 1979 
08-29 12:57:03.596 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 88 
                       currentposition: 5 
08-29 12:57:05.862 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 92 
                       currentposition: 4 
08-29 12:57:08.291 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 95 
                       currentposition: 8 
08-29 12:57:13.903 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 99 
                       currentposition: 9 
08-29 12:57:14.904 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 100 
                       currentposition: 668 
08-29 12:57:34.261 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 100 
                       currentposition: 224068 
+0

Warum wird setOnPreparedListener zweimal in derselben mediaPlayer-Instanz aufgerufen? Erstmal in der onCreate() Methode, wie 'mediaPlayer.setOnPreparedListener (this)', und dann in der prepareMediaPlayer() Methode erstellen und setzen Sie eine neue 'mediaPlayer.setOnPreparedListener (new MediaPlayer.OnPreparedListener()'. –

+0

@StasysSkliutas You Stimmt, der erste 'setOnPreparedListener' war ein Fehler. Ich habe ihn entfernt, aber das Ergebnis hat sich nicht geändert. – Evelyn

+0

Einige zusätzliche Informationen wären hilfreich. Auf welcher Android-Version lief der Code erfolgreich ?, Auf welcher Android-Version ist der Code fehlgeschlagen? Was ist die Quelle des Streams, gehe ich davon aus, dass es sich um eine Remote-Ressource handelt? Tritt dieses Verhalten bei einer Datei auf, zB song1.mp3, song2.mp3, ... oder nur für eine bestimmte Datei? –

Antwort

2

Es ist ein Hinweis darauf in den developer docs bezogen werden:

Es ist ein subtiler, aber wichtiger Unterschied zwischen einem neu errichteten Mediaplayer-Objekt und dem Mediaplayer-Objekt nach Reset() aufgerufen wird. Es ist ein Programmierfehler auf Methoden aufrufen wie getCurrentPosition() ... im Ruhezustand für beide Fälle

Es fügt auch:

Es ist wichtig, dass die Vorbereitung Zustand zu beachten ist, ist ein Übergangszustand und das Verhalten beim Aufrufen einer Methode mit Nebeneffekt, während sich ein MediaPlayer-Objekt im Status Vorbereiten befindet, ist nicht definiert.

Es scheint, es ist nicht sicher für Sie getCurrentPosition() erst nach dem onPrepared Rückruf zu nennen ist. Die Lösung besteht wahrscheinlich darin, die Wiedergabe während des Pufferns anzuhalten.

+0

Gute Information, aber selbst wenn ich die Protokollzeile entferne, die 'getCurrentPosition()' aufruft, wird es immer noch unregelmäßig abgespielt. Der MediaPlayer beginnt erst mit 'mediaPlayer.start()' im 'onPrepared'-Listener zu spielen, so dass im Zustand" Preparing "oder" Idle "nichts aufgerufen wird. – Evelyn

+0

Sie sehen also den Daumen springen oder den Ton hören?Hast du irgendwo eine Beispiel-App? –

+0

Sowohl der Daumen als auch der Ton springen. Der Link zum Beispielcode ist in der Frage, der einzige Code, den ich hinzugefügt habe, ist oben gezeigt. – Evelyn