2011-11-07 134 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);