2011-11-07 131 views
9

如何在不創建MediaPlayer實例的情況下獲取mp3軌道持續時間?我只需要顯示MP3文件列表中的MP3歌曲長度,所以我覺得我不應該在列表在android中獲取mp3持續時間

而另一位創建MediaPlayer對象的每個曲目:

有時MediaPlayer的返回歌曲的時間錯誤(我認爲這是因爲這些文件的比特率是動態的)。我怎樣才能得到正確的歌曲時間?

回答

6

您可以使用MediaMetadataRetriever來獲取歌曲的持續時間。使用METADATA_KEY_DURATION結合extractMetadata()功能。

+0

非常感謝你,這個類是非常有幫助的,但它從API級別10,安卓2.3.3和更高的工作。我需要更多的通用解決方案( – pleerock

+0

嗯,對不起,我不知道有什麼其他的方式 –

+0

這不是很有用,因爲大多數人仍然有Eclair或Froyo。也許在幾年內.. – miq

1

如果您想支持較舊的Android版本,則可以使用第三方庫。例如http://www.jthink.net/jaudiotagger/可以正常工作,但對於Android應用程序(略小於1 MB)而言,它相對耗費空間。

真正的程序員當然會從二進制文件中解析持續時間,而不使用任何庫;)我沒有足夠的技能。

+0

'jaudiotagger'與Android不兼容。 –

+1

jaudiotagger與Android兼容。我已經嘗試。 – miq

25
 // load data file 
     MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
     metaRetriever.setDataSource(filePath); 

String out = ""; 
     // get mp3 info 

     // convert duration to minute:seconds 
String duration = 
    metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    Log.v("time", duration); 
    long dur = Long.parseLong(duration); 
    String seconds = String.valueOf((dur % 60000)/1000); 

    Log.v("seconds", seconds); 
    String minutes = String.valueOf(dur/60000); 
    out = minutes + ":" + seconds; 
    if (seconds.length() == 1) { 
     txtTime.setText("0" + minutes + ":0" + seconds); 
    }else { 
     txtTime.setText("0" + minutes + ":" + seconds); 
    } 
    Log.v("minutes", minutes); 
     // close object 
     metaRetriever.release(); 
+0

真棒!謝謝:)我不得不承認我很驚訝它需要這麼多代碼... –

+0

它並不需要太多的代碼,在他調用extractMetaData之後幾乎所有的東西都與問題無關。 – IcedDante

0

我發現這個更準確getLength with FFmpeg

int soundLength = (int) new SoxController(context, new File(""), shell).getLength(soundPath);