在安卓中获取mp3音频时长

17

如何在不创建MediaPlayer实例的情况下获取mp3音轨的持续时间?我只需要在mp3文件列表中显示歌曲长度,因此我认为不应该为列表中的每个音轨创建MediaPlayer对象。

另一个问题:

有时MediaPlayer会返回错误的歌曲持续时间(我认为这是因为这些文件的比特率是动态的)。如何获取歌曲的正确持续时间?

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
38
       // 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();

10

非常感谢,这个课程非常有帮助,但它只适用于API级别10及以上的Android 2.3.3。我需要更通用的解决方案。 - pleerock
哦,抱歉。我不知道其他的方法。 - Kurtis Nusbaum
这并不是很有用,因为大多数人仍然使用爱克莱尔或弗罗约版本。也许再过几年吧。 - miq
@miq 你有其他的解决方案吗? - Kurtis Nusbaum

3

以下是Kotlin版本:

var metaRetriever:MediaMetadataRetriever = MediaMetadataRetriever()
metaRetriever.setDataSource(filePath)

var out:String = ""
var txtTime:String = ""

var duration:String = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)

Log.d("DURATION VALUE", duration)

var dur:Long = duration.toLong()
var seconds:String = ((dur % 60000)/1000).toString()

Log.d("SECONDS VALUE", seconds)

var minutes:String = (dur / 60000).toString()
out = minutes + ":" + seconds

if (seconds.length == 1){
    txtTime = "0" + minutes + ":0" + seconds
}
else {
    txtTime = "0" + minutes + ":" + seconds
}

Log.d("MINUTES VALUE", minutes)
Log.d("FORMATTED TIME", txtTime)

metaRetriever.release()

1

如果你想支持旧版的Android系统,你可以使用第三方库。例如http://www.jthink.net/jaudiotagger/就可以很好地工作,尽管对于一个Android应用来说占用了相对较大的空间(略小于1MB)。

当然,真正的程序员会从二进制文件中解析出时长,而不使用任何库 ;) 我自己技术不够熟练,做不到这一点。


jaudiotagger 不兼容 Android。 - Pulkit Goyal
@miq 上次我查看源代码时,有Swing导入。 - TheRealChx101

0

我发现使用FFmpeg更准确获取长度

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,