2011-05-20 54 views
0

我開發的應用程序,其中有一些音頻文件的列表。當我點擊一個項目時,它會播放相應的音頻並顯示持續時間。問題是在Android 2.1設備和模擬器的持續時間是正確的,但在Android 2.2模擬器它顯示錯誤的持續時間。有沒有人有想法來解決這個問題。有沒有一種好的方法來獲得正確的聲音文件的持續時間。音頻文件位於res/raw文件夾中。有一件事iPhone的相同的聲音顯示正確的持續時間。時間錯誤在Android 2.2

+0

是否以WAV/LPCM格式的文​​件是什麼? – inazaruk 2011-05-20 19:30:48

+0

所有的文件都是MP3格式 – gypsicoder 2011-05-20 19:34:58

回答

2

這可能是由於VBR文件。可變比特率提頭,這可能是使用的Android軟件來計算它的長度MP3的持續率。

我記得看過一個實用工具,可以計算出一個「正確」的有效比特率和前綴在啓動一個單獨的MP3數據幀只是爲了讓報告「正確的」(平均)比特率。

嘗試VBRFix

整個一首歌曲有需要高品質和需要低質量(即沉默)分點。 VBR(可變比特率)在文件內爲我們提供了一個可變的質量,而不是將整個文件保存在一個質量上。這使我們能夠更有效地使用文件空間。問題是,許多MP3播放程序根據他們找到的第一個比特率和文件大小來估計MP3的時間。此外,通過文件跳躍時的位置是不一樣的 - 通過VBR MP3中途可能無法通過這首歌一半。 OGG Vorbis是一種更先進的免費的音樂格式,並使用VBR默認沒有問題

這也是在倉庫的Ubuntu(Debian的可能):sudo apt-get install vbrfix

+0

謝謝你給的解決方案。我正在用foobar2000修復VBR。 – gypsicoder 2011-05-20 19:46:55

0

我可能是有點晚在回答這個問題,但無論如何,我是能夠修復使用Ringdroid類似類型的問題。這是你必須做的使用Rindroid獲得音頻持續時間從VBR文件毫秒

public class AudioUtils 
{ 
    public static long getDuration(CheapSoundFile cheapSoundFile) 
    { 
     if(cheapSoundFile == null) 
      return -1; 
     int sampleRate = cheapSoundFile.getSampleRate(); 
     int samplesPerFrame = cheapSoundFile.getSamplesPerFrame(); 
     int frames = cheapSoundFile.getNumFrames(); 
     cheapSoundFile = null; 
     return 1000 * (frames * samplesPerFrame)/sampleRate; 
    } 

    public static long getDuration(String mediaPath) 
    { 
     if(mediaPath != null && mediaPath.length() > 0) 
      try 
      { 
       return getDuration(CheapSoundFile.create(mediaPath, null)); 
      }catch (FileNotFoundException e){} 
      catch (IOException e){} 
     return -1; 
    } 
} 

希望這有助於