2012-09-29 11 views
8

Ich benutze eine SeekBar, um den Fortschritt einer Audiodatei anzuzeigen und zu einer bestimmten Zeit zu suchen. Zum Aktualisieren verwende ich eine Runnable, die getCurrentPosition() auf einem MediaPlayer jede Sekunde aufruft. Jedes Mal, wenn das passiert, ist der Ton etwas verzögert. Da ich es oft anrufe, bekomme ich beim Spielen etwas merkbares Stottern. Wenn es relevant ist, verwende ich SetAudioStreamType (AudioManager.STREAM_MUSIC) und das Dateiformat ist mp4 mit AAC-Audio (kein Video) und ich benutze Android 2.3.4. Gibt es eine Möglichkeit, mit getCurrentPosition() gute Audiodaten zu erhalten, oder muss ich meine eigenen Fortschrittsberechnungen implementieren?Android MediaPlayer getCurrentPosition() verursacht Audio-Stottern

Das Runnable:

private Runnable mUpdateTask = new Runnable(){ 

    @Override 
    public void run() { 
     mSeekBar.setProgress((int) (mPlayer.getCurrentPosition() * 100/mArrayAdapter.getRecording(mPlayingId).mDuration)); 
     mHandler.postDelayed(mUpdateTask, 999); 
    } 
}; 
+0

Code bitte ... – Shiva

+0

@Shivaji hinzugefügt Quelle – DariusL

+0

ich für Videoview das getan hatte, Sie können es [hier] überprüfen (http://stackoverflow.com/questions/7802645/in-android-how-to-get-the-progress-time-of-the-video-played-under-videoview/7803166 # 7803166) –

Antwort

-1

ich verwenden:

private Runnable mUpdateTask = new Runnable(){ 

    @Override 
    public void run() 
    { 
     mSeekBar.setProgress(mMediapPlayer.getCurrentPosition());  
     mHandler.postDelayed(mUpdateTask, 999); 
    } 
}; 

Sie auch bar Fortschritt ändern Hörer wie folgt suchen anwenden können Methode, um den Fortschritt zu berechnen '

public static int getProgressPercentage(long currentDuration, 
      long totalDuration) { 
     Double percentage = (double) 0; 

     long currentSeconds = (int) (currentDuration/1000); 
     long totalSeconds = (int) (totalDuration/1000); 

     // calculating percentage 
     percentage = (((double) currentSeconds)/totalSeconds) * 100; 

     // return percentage 
     return percentage.intValue(); 
    } 

Hinweis: mPlayer.getCurrentPosition() ist nicht korrekt. Es wurden einige Fehler gemeldet. Ich hatte das Problem, dass die aktuelle Position höher war als die Gesamtdauer.

+0

Ich habe etwas ähnliches implementiert, aber ein bisschen komplizierter, da ich pausieren und suchen muss. – DariusL

+0

Können Sie mir bitte sagen, was an die Methode weitergegeben werden muss? dh. Wie bekomme ich aktuelleDuration? – Arti

2

Sie etwas tun können:

mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() 
      {    
       @Override 
       public void onStopTrackingTouch(SeekBar seekBar) 
       {    
       } 
       @Override 
       public void onStartTrackingTouch(SeekBar seekBar) 
       {     
       } 
       @Override 
       public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) 
       { 
        if (fromUser) 
        { 
         int secProgress = seekBar.getSecondaryProgress(); 
           if (secProgress> progress) 
           { 
            mMediapPlayer.seekTo(progress); 
           } 
           else 
           { 
            seekBar.setProgress(mSeekBar.getProgress()); 
           } 
        } 

       }    
      }); 
      mMediapPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() 
      { 

        @Override 
        public void onBufferingUpdate(MediaPlayer mp, int percent) 
        { 
         mSeekBar.setSecondaryProgress((mSeekBar.getMax()/100)*percent); 

        } 
       }); 
+0

Dies ist die richtige Antwort! –

0

Ich hatte das gleiche Problem oder etwas ähnliches.

Als ich mMediapPlayer.getCurrentPosition() in einer Timertask verwendet haben die SeekBar zu aktualisieren, hörte ich Tonprobleme wie Echo, aber eigentlich das Problem war es nicht ..

Das Problem ist, dass ich auch OnSeekBarChangeListener SeekBar verwendet habe, für manuelle Suche, aber was passiert ist, dass Update die seekBar von der TimerTask auch den Hörer ausgelöst, die und dies verursacht, dass die mp wieder an diese Position zurück ..

Ich habe es mit dem fromUser Argument behoben wie hier vorgeschlagen, nur wenn die seekBar manuell geändert wird.

Hier ist mein Beispielcode:

Die Timertask:

public void initializeTimerTask() { 

    mTimerTask = new TimerTask() { 

     public void run() { 

      int progress = mp.getCurrentPosition()/1000; 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mSeekBar.setProgress(progress); 
        tvDuration.setText(DateUtils.formatElapsedTime(progress)); 
       } 
      }); 

     } 
    }; 
} 

Listener:

mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      if(mp != null && fromUser){ 
       mp.seekTo(progress * 1000); 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    });