【发布时间】:2011-11-07 20:34:20
【问题描述】:
如何在不创建 MediaPlayer 实例的情况下获取 mp3 曲目时长?我只需要在 mp3 文件列表中显示 mp3 歌曲长度,所以我认为我不应该为列表中的每个曲目创建 MediaPlayer 对象
还有一个:
有时 MediaPlayer 会返回错误的歌曲持续时间(我认为是这样,因为这些文件的比特率是动态的)。如何获得正确的歌曲时长?
【问题讨论】:
标签: android android-mediaplayer java
如何在不创建 MediaPlayer 实例的情况下获取 mp3 曲目时长?我只需要在 mp3 文件列表中显示 mp3 歌曲长度,所以我认为我不应该为列表中的每个曲目创建 MediaPlayer 对象
还有一个:
有时 MediaPlayer 会返回错误的歌曲持续时间(我认为是这样,因为这些文件的比特率是动态的)。如何获得正确的歌曲时长?
【问题讨论】:
标签: android android-mediaplayer java
// 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();
【讨论】:
您可以使用MediaMetadataRetriever 获取歌曲的时长。将METADATA_KEY_DURATION 与extractMetadata() 功能结合使用。
【讨论】:
这是 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()
【讨论】:
如果您想支持较旧的 Android 版本,可以使用 3rd 方库。例如,http://www.jthink.net/jaudiotagger/ 工作正常,但对于 Android 应用程序来说它相对占用空间(略小于 1 MB)。
真正的程序员当然会在不使用任何库的情况下从二进制文件中解析持续时间;)我没有足够的技能。
【讨论】:
jaudiotagger 与 Android 不兼容。
我发现这个更准确getLength with FFmpeg
int soundLength = (int) new SoxController(context, new File(""), shell).getLength(soundPath);
【讨论】: