如何在不創建MediaPlayer實例的情況下獲取mp3軌道持續時間?我只需要顯示MP3文件列表中的MP3歌曲長度,所以我覺得我不應該在列表在android中獲取mp3持續時間
而另一位創建MediaPlayer對象的每個曲目:
有時MediaPlayer的返回歌曲的時間錯誤(我認爲這是因爲這些文件的比特率是動態的)。我怎樣才能得到正確的歌曲時間?
如何在不創建MediaPlayer實例的情況下獲取mp3軌道持續時間?我只需要顯示MP3文件列表中的MP3歌曲長度,所以我覺得我不應該在列表在android中獲取mp3持續時間
而另一位創建MediaPlayer對象的每個曲目:
有時MediaPlayer的返回歌曲的時間錯誤(我認爲這是因爲這些文件的比特率是動態的)。我怎樣才能得到正確的歌曲時間?
您可以使用MediaMetadataRetriever來獲取歌曲的持續時間。使用METADATA_KEY_DURATION結合extractMetadata()功能。
如果您想支持較舊的Android版本,則可以使用第三方庫。例如http://www.jthink.net/jaudiotagger/可以正常工作,但對於Android應用程序(略小於1 MB)而言,它相對耗費空間。
真正的程序員當然會從二進制文件中解析持續時間,而不使用任何庫;)我沒有足夠的技能。
'jaudiotagger'與Android不兼容。 –
jaudiotagger與Android兼容。我已經嘗試。 – miq
// 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();
真棒!謝謝:)我不得不承認我很驚訝它需要這麼多代碼... –
它並不需要太多的代碼,在他調用extractMetaData之後幾乎所有的東西都與問題無關。 – IcedDante
我發現這個更準確getLength with FFmpeg
int soundLength = (int) new SoxController(context, new File(""), shell).getLength(soundPath);
非常感謝你,這個類是非常有幫助的,但它從API級別10,安卓2.3.3和更高的工作。我需要更多的通用解決方案( – pleerock
嗯,對不起,我不知道有什麼其他的方式 –
這不是很有用,因爲大多數人仍然有Eclair或Froyo。也許在幾年內.. – miq