如何在不创建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