Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中获取mp3持续时间_Android_Android Mediaplayer_Java - Fatal编程技术网

在android中获取mp3持续时间

在android中获取mp3持续时间,android,android-mediaplayer,java,Android,Android Mediaplayer,Java,如何在不创建MediaPlayer实例的情况下获得mp3曲目的持续时间?我只需要在mp3文件列表中显示mp3歌曲的长度,所以我认为不应该为列表中的每个曲目创建MediaPlayer对象 还有一个: 有时MediaPlayer会返回错误的歌曲时长(我认为是这样,因为这些文件的比特率是dinamic)。如何获得歌曲的正确持续时间?您可以使用获取歌曲的持续时间。将与函数结合使用。如果要支持较旧的Android版本,可以使用第三方库。例如,虽然Android应用程序占用的空间相对较小(略小于1MB),但

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

还有一个:


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

您可以使用获取歌曲的持续时间。将与函数结合使用。

如果要支持较旧的Android版本,可以使用第三方库。例如,虽然Android应用程序占用的空间相对较小(略小于1MB),但它仍然可以正常工作


真正的程序员当然会在不使用任何库的情况下从二进制文件解析持续时间;)我没有足够的技能来做这件事。

我发现这更准确

       // 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();

以下是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()

非常感谢,这个类非常有用,但是它是从api级别10、android 2.3.3和更高版本开始工作的。我需要更通用的解决方案(嗯,对不起。我不知道其他任何方法。这不是很有用,因为大多数人仍然有Eclair或Froyo。也许几年后。@miq你有其他解决方案吗?
Jaudiotager
与Android不兼容。@miq上次我看源代码时,有Swing导入
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()