2012-09-29 116 views
8

我正在使用SeekBar來顯示音頻文件的進度和尋找到一定的時間。爲了更新,我使用每隔一秒左右在MediaPlayer上調用getCurrentPosition()的Runnable。每當發生這種情況時,音頻中都會有少量滯後。由於我經常打電話,所以在玩東西的時候我會看到非常明顯的口吃。如果它是相關的,我使用setAudioStreamType(AudioManager.STREAM_MUSIC)和文件格式是AAC音頻(無視頻)mp4,我使用Android 2.3.4。有沒有辦法通過getCurrentPosition()獲得良好的音頻,還是我必須實現自己的進度計算?Android MediaPlayer getCurrentPosition()導致音頻斷續

了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

代碼,請... – Shiva

+0

@Shivaji添加源 – DariusL

+0

我做了,對於VideoView你可以檢查出來[這裏](http://stackoverflow.com/questions/7802645/in-android-how-to-get-the-progress-time-of-the-video-played-under-videoview/7803166 #7803166) –

回答

-1

我用這個方法來計算進度'

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

注意:mPlayer.getCurrentPosition()不準確。有一些錯誤報告。我有問題,目前的位置高於totalDuration。

+0

我已經實現了類似的東西,但因爲我已經暫停和尋找,所以更復雜一些。 – DariusL

+0

你能告訴我該怎麼傳遞給該方法嗎?即。如何獲得currentDuration? – Arti

2

你可以做這樣的事情:

private Runnable mUpdateTask = new Runnable(){ 

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

,你也可以申請搜索欄進度變化監聽如下:

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

這是正確的答案! –

0

我有同樣的問題或類似的東西。

當我在一個TimerTask更新搜索欄使用mMediapPlayer.getCurrentPosition(),我聽到這樣的聲音的回聲問題,但實際上這個問題是不存在..

的問題是,我還使用搜索欄OnSeekBarChangeListener爲手動搜索,但所發生的事情是,更新從TimerTask的搜索條也引發聽者,這確實mp.seekTo(progress)而這,引起了MP要返回到再次那個位置..

我使用fromUser參數固定它正如這裏所建議的那樣,只有在seekBar手動更改時才執行查找。

這裏是我的示例代碼:

中,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)); 
       } 
      }); 

     } 
    }; 
} 

監聽:

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

     } 
    }); 
相關問題