2016-04-15 10 views
0

Ich benutze MediaPlayer, um einige aufgenommene Audio und SeekBar zu spielen, um den Fortschritt des Spiels zu zeigen. Mein Problem ist: wenn ich auf der SeekBar klicken, um eine Zeitposition zu springen, das folgende Beispiel passiert, und ich sehe auf dem Log, wenn ich die progess sehen wollen:MediaPlayer getProgess - falsche Werte

getProgress (ms): 10000
getProgress (ms): 9956
getProgress (ms): 10000

So springe ich auf den 10. Sekunde der Audioaufzeichnung. Die MediaPlayer springt auf die 10. Sekunde aber nach springt sie ein bisschen zurück wie man sieht.

Ich habe alles versucht, was ich konnte. Ich habe versucht, andere Recorder-Audio-Dateien zu spielen, aber passierte das gleiche. Versucht, mit der Bitrate und Sampling-Rate zu spielen, aber das gleiche passiert.

Ich hoffe, jemand kennt die Lösung dafür. Danke.

Edit:

Code:

SeekBar:

progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver); 
      // handler2.removeCallbacks(updateTimeTask); 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      if (PlayerForegroundService.player != null) { 
      // handler2.removeCallbacks(updateTimeTask); 
       PlayerForegroundService.player.seekTo(seekBar.getProgress()); 
       // handler2.post(updateTimeTask); 
       LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter(Constants.ACTION.PLAYER_UPDATE_UI)); 
      } 
     } 
    }); 
} 

getProgess():

public int getProgress(){ 
    if (player != null) { 
     Log.i(Constants.DEFAULTS.LOG_TAG, ""+player.getCurrentPosition()); 
     return player.getCurrentPosition(); 
    } 
    else 
     return 0; 
}  

Der Code, wenn getProgress aufgerufen wird:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 

    receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, final Intent intent) { 
      actPosition.setText(intent.getStringExtra("formattedtimeplay")); 
      progressBar.setProgress(PlayerForegroundService.player.getProgress()); 
      if (intent.getBooleanExtra("pausedplay", false)) 
       playButton.setImageResource(R.drawable.playfilled); 
     } 
    }; 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter(Constants.ACTION.PLAYER_UPDATE_UI)); 
    super.onCreate(savedInstanceState); 
}  
+0

posten Sie bitte Ihren Code. –

+0

Wo protokollieren Sie diesen Fortschritt? Ich denke, um einen genauen Wert zu erhalten, sollten Sie es auf SeeseekComplete() eines onSeekCompleteListener überprüfen ... – Opiatefuchs

+0

wo ist Ihr 'MediaPlayer.OnSeekCompleteListener'? – pskink

Antwort

0

Es scheint, dass ich das Problem gelöst habe. Vorher habe ich den Maximalwert von SeekBar in Sekunden eingestellt. Aber nachdem ich das Maximum in Millisekunden und die Werte von seekTo in Millisekunden eingestellt habe, funktioniert es gut.