2012-09-29 13 views
8

Sto utilizzando un SeekBar per visualizzare l'avanzamento di un file audio e per la ricerca in un determinato momento. Per l'aggiornamento, utilizzo un Runnable che chiama getCurrentPosition() su un MediaPlayer ogni secondo circa. Ogni volta che succede, c'è una piccola quantità di ritardo nell'audio. Dal momento che lo chiamo spesso, ottengo una balbuzie molto evidente mentre suono qualcosa. Se è rilevante, sto usando setAudioStreamType (AudioManager.STREAM_MUSIC) e il formato del file è mp4 con audio AAC (nessun video) e sto usando Android 2.3.4. C'è un modo per ottenere un buon audio con getCurrentPosition(), o devo implementare i miei calcoli di avanzamento?Android MediaPlayer getCurrentPosition() causa la stutter audio

Il 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

codice si prega di ... – Shiva

+0

@Shivaji fonte – DariusL

+0

aggiunto avevo fatto per VideoView puoi verificarlo [qui] (http://stackoverflow.com/questions/7802645/in-android-how-to-get-the-progress-time-of-the-video-played-under-videoview/7803166 # 7803166) –

risposta

-1

Io uso questo metodo per caluclate progress '

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(); 
    } 

Nota: mPlayer.getCurrentPosition() non è preciso. Ci sono alcuni bug segnalati. Ho avuto problemi che la posizione corrente era superiore a TotalDuration.

+0

Ho implementato qualcosa di simile, ma un po 'più complicato da quando ho fatto una pausa e cercando. – DariusL

+0

Puoi dirmi cosa deve essere passato al metodo? vale a dire. come ottenere correnteDuration? – Arti

2

si può fare qualcosa di simile:

private Runnable mUpdateTask = new Runnable(){ 

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

si può anche applicare cercare barra di avanzamento cambiamento ascoltatore come segue:

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

Questa è la risposta corretta! –

0

Ho avuto lo stesso problema o qualcosa di simile.

Quando ho usato mMediapPlayer.getCurrentPosition() in un TimerTask per aggiornare il SeekBar, ho sentito problemi audio come eco, ma in realtà il problema non era lì ..

Il problema è che ho usato anche SeekBar OnSeekBarChangeListener per ricerca manuale, ma quello che è successo è che l'aggiornamento del seekBar dal TimerTask innescato anche l'ascoltatore, che ha fatto mp.seekTo(progress) e questo, ha causato il mp per tornare a quella posizione di nuovo ..

ho risolto esso utilizzando l'argomento fromUser come suggerito qui per cercare solo se la seekBar è cambiata manualmente.

Ecco il mio codice di esempio:

Il 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) { 

     } 
    }); 
Problemi correlati