MediaMetadataRetriever中媒体持续时间的度量单位是多少

时间:2012-05-11 14:40:06

标签: android metadata media duration

可以使用

 String MediaMetadataRetriver.extractMetadata(int key);

 key = MediaMetadataRetriver.METADATA_KEY_DURATION

提取媒体持续时间。

此函数返回一个String,但没有关于此字符串表示的格式或测量单位的文档。 我认为它是 ms 中的整数,但MediaMetadataRetriever的其余部分使用 us

那么持续时间的单位是多少?你认为缺乏规范是故意还是错误?

3 个答案:

答案 0 :(得分:13)

见这个

  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);
                         }
                    }  

答案 1 :(得分:1)

因为extractMetadata可以返回null,所以需要在check:

中包装此调用
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);

(来自http://www.codota.com/android/scenarios/52fcbd47da0af79604fb4a67/android.media.MediaMetadataRetriever?tag=dragonfly

答案 2 :(得分:1)

提取的输出为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));
    }