2012-06-21 90 views
3

MediaPlayer的getDuration()方法給了我一些音頻文件的錯誤值。我認爲所有這些文件的共同特點是它們使用Audacity或其他音頻編輯工具進行處理。嘗試將MediaPlayer進度綁定到進度欄時,這是一個問題。MediaPlayer.getDuration()返回錯誤的持續時間

我繼續,並記錄它:

while(mPlayer.isPlaying()) 
    Log.i("progress/total", 
      mPlayer.getCurrentPosition() + 
      "/" + mPlayer.getDuration()); 

,發現這個:

I/progress/total(643): 14615/14620 
I/progress/total(643): 14647/14620 

這是僅有的兩個十萬日誌行,但問題是進展後經過什麼getDuration()相信是歌曲的總持續時間,它只是繼續前進。因爲MediaPlayer實際上可以提供正確的總持續時間,是否有一種方法可以使用它來爲ProgressBar獲取適當的最大值?

+0

有多長歌實際上是? – ghostbust555

+0

約18秒。 – JMRboosties

+0

這些文件的格式是什麼?很多玩家報告可變比特率MP3的壞值。嘗試以固定比特率再次導出它們,並查看是否修復了它。 – Geobits

回答

2

當MediaPlayer.getDuration()返回542434毫秒的MP3文件(HTC Desire C與ICS 4.0.3)時,我有類似的問題。 文件本身大約89秒,差別太大。 我檢查的mp3文件的內容,看到一些奇怪的XML,如:

<?xpacket begin="п»ї" id="W5M0MpCehiHzreSzNTczkc9d"?> 
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.351735, 2008/07/22-18:04:26  "> 

保存此文件作爲新的一個XML掉了getDuration()返回正確的值之後。 我知道它不會幫助那些需要播放無法修改的文件,但對於那些可以 - 它應該有所幫助的用戶。

+0

我們使用的是通過Adobe Soundbooth導出的MP3;將它們轉換成Audacity中的Ogg現在似乎給出了正確的持續時間。 –

0

幾天前我試圖播放演示播放器,當我在Android模擬器中測試時,它的行爲與您在問題中提到的相同,但當我在某個實際設備中嘗試時,它給了我準確的媒體價值持續時間。

如果你打算只播放媒體與搜索條同步,那麼你可以這樣做下面,

if (!mediaPlayer.isPlaying()) 
mediaPlayer.start(); 

handler.post(new SeekbarRefresh(seekbar)); 

//Class to update progress of seekbar according to music player 
private class SeekbarRefresh implements Runnable { 
    SeekBar seekBar; 

    public SeekbarRefresh(SeekBar seekBar, ImageView imageView) { 
     this.seekBar = seekBar; 
    } 

    @Override 
    public void run() { 

     if (mediaPlayer != null) { 
      if (mediaPlayer.getDuration() > 0) { 
       int currentDuration = mediaPlayer.getCurrentPosition(); 
       seekBar.setProgress(currentDuration); 
       if (mediaPlayer.isPlaying()){ 
        handler.post(this); 
        isAudioPlaying = true; 
        } 
       else { 
        handler.removeCallbacks(this); 
        isAudioPlaying = false; 
       } 
      } 
     } 
    } 
} 

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

      mediaPlayer.seekTo(progress); 
     } 
    }); 
0

我也遇到過類似的情況。在我的情況下,mPlayer.getDuration()mPlayer.getCurrentPosition()之間的時差約爲80秒。

在閱讀了關於該主題的幾篇文章後,我使用第三方軟件將mp3的採樣率從22,000 kHz轉換爲44,100 kHz。一旦轉換,getDuration()getCurrentPosition()的結果幾乎相同(0.0012s恆定誤差)。

這裏使用了測試:

dur = mp.getDuration(); 
Log.d("dur", dur + " <- getDuration"); 
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    public void onCompletion(MediaPlayer mp) { 
     // finish current activity 
     Log.d("dur", mp.getCurrentPosition() + " <- getCurrentPostion"); 

    } 
});