2012-09-29 14 views
8

Estoy usando una SeekBar para mostrar el progreso de un archivo de audio y para buscar un tiempo determinado. Para la actualización uso un Runnable que llama a getCurrentPosition() en un MediaPlayer cada segundo más o menos. Cada vez que eso sucede, hay una pequeña cantidad de retraso en el audio. Como lo llamo a menudo, recibo un tartamudeo muy notable mientras toco algo. Si es relevante, estoy usando setAudioStreamType (AudioManager.STREAM_MUSIC) y el formato de archivo es mp4 con audio AAC (sin video) y estoy usando Android 2.3.4. ¿Hay alguna manera de obtener un buen audio con getCurrentPosition(), o tengo que implementar mis propios cálculos de progreso?Android MediaPlayer getCurrentPosition() provoca un tartamudeo de audio

El Ejecutable:

private Runnable mUpdateTask = new Runnable(){ 

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

código por favor ... – Shiva

+0

@Shivaji fuente – DariusL

+0

añadió que había hecho que por VideoView usted puede verificarlo [aquí] (http://stackoverflow.com/questions/7802645/in-android-how-to-get-the-progress-time-of-the-video-played-under-videoview/7803166 # 7803166) –

Respuesta

-1

utilizo este método para caluclate el progreso '

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() no es exacto. Hay algunos errores reportados. Tuve el problema de que la posición actual era más alta que la duración total.

+0

He implementado algo similar, pero un poco más complicado ya que tengo pausas y búsquedas. – DariusL

+0

¿Puede decirme qué se debe pasar al método? es decir. cómo obtener laDuración actual? – Arti

2

se puede hacer algo como esto:

private Runnable mUpdateTask = new Runnable(){ 

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

también puede aplicar buscar el cambio oyente barra de progreso de la siguiente manera:

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

¡Esta es la respuesta correcta! –

0

Tuve el mismo problema o algo similar.

Cuando he utilizado mMediapPlayer.getCurrentPosition() en un TimerTask para actualizar SeekBar, oí problemas de sonido como eco, pero en realidad el problema no estaba allí ..

La cuestión es que también he utilizado para SeekBar OnSeekBarChangeListener búsqueda manual pero lo que pasó es que la actualización de la seekBar TimerTask también provocó el oyente, que hizo mp.seekTo(progress) y esto, hizo que el punto de fusión para volver de nuevo a esa posición otra vez ..

lo he arreglado con el argumento fromUser como se sugiere aquí, buscar solo si el seekBar cambió manualmente.

Aquí está mi código de ejemplo:

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

     } 
    }; 
} 

Oyente:?

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

     } 
    }); 
Cuestiones relacionadas