一个可以使用
String MediaMetadataRetriver.extractMetadata(int key);
与
key = MediaMetadataRetriver.METADATA_KEY_DURATION
提取媒体持续时间。
此函数返回一个字符串,但是没有有关此字符串表示的格式或度量单位的文档。我假设它是ms中的整数,但是MediaMetadataRetriever的api的其余部分使用us。
那么持续时间的单位是什么?您认为缺乏规范是故意的还是有缺陷的?
查看此
long durationMs = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
long duration = durationMs / 1000;
long h = duration / 3600;
long m = (duration - h * 3600) / 60;
long s = duration - (h * 3600 + m * 60);
String durationValue;
if (h == 0) {
durationValue = String.format(
activity.getString(R.string.details_ms), m, s);
} else {
durationValue = String.format(
activity.getString(R.string.details_hms), h, m, s);
}
}
因为extractMetadata可以返回null,所以您需要将此调用包装在检查中:
int duration = 0;
String dur = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
if (dur != null) {
duration = Integer.parseInt(dur);
}
mDuration = duration;
long h = duration / 3600;
long m = (duration - h * 3600) / 60;
long s = duration - (h * 3600 + m * 60);
提取的输出为String
,您需要解析为long
。您可以像这样处理已格式化的持续时间:
public static String formatDurationLongToString() {
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInMillisecond = Long.parseLong(time)
return String.format(Locale.US, "%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(timeInMillisecond),
TimeUnit.MILLISECONDS.toMinutes(timeInMillisecond) % TimeUnit.HOURS.toMinutes(1),
TimeUnit.MILLISECONDS.toSeconds(timeInMillisecond) % TimeUnit.MINUTES.toSeconds(1));
}