Android如何获取特定文件夹中可用的视频文件持续时间?

时间:2012-07-28 10:07:52

标签: android video duration

我正在研究android中的视频文件持续时间查找。但我无法得到它。我的视频文件位于SD卡的特定文件夹中。想要将它们作为列表视图与持续时间和名称绑定。我有名字。但搜索解决方案以查找持续时间。请帮我 。提前致谢 。

Rajesh。

3 个答案:

答案 0 :(得分:9)

int msec = MediaPlayer.create(context,Uri.fromFile(new File(path)))。getDuration();

答案 1 :(得分:1)

您无需创建MediaPlayer。我已经制作了一个功能,可以为你的视频文件存储安卓设备。

public static long checkVideoDurationValidation(Context context, Uri uri){
    Log.d("CommonHandler", "Uri: " + uri);
    Cursor cursor = MediaStore.Video.query(context.getContentResolver(), uri, new
            String[]{MediaStore.Video.VideoColumns.DURATION});
    long duration = 0;
    if (cursor != null && cursor.moveToFirst()) {
        duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Video
                .VideoColumns.DURATION));
        cursor.close();
    }

    return duration;
}

如果您对此有任何疑问,请与我联系。

答案 2 :(得分:0)

不要使用MediaPlayer!效率低

使用MediaMetadataRetriever代替 only 所需的元数据

Java解决方案

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
// There are other variations of setDataSource(), if you have a different input
retriever.setDataSource(context, Uri.fromFile(videoFile));
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long durationMs = Long.parseLong(time);
retriever.release()

Kotlin扩展解决方案

这是在Kotlin中获取媒体文件持续时间的方法

fun File.getMediaDuration(context: Context): Long {
    if (!exists()) return 0
    val retriever = MediaMetadataRetriever()
    retriever.setDataSource(context, Uri.parse(absolutePath))
    val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
    retriever.release()

    return duration.toLongOrNull() ?: 0
}

如果您想使其更安全(Uri.parse可能引发异常),请使用此组合。其他的通常也是有用的:)

fun String?.asUri(): Uri? {
    try {
        return Uri.parse(this)
    } catch (e: Exception) {
    }
    return null
}

val File.uri get() = this.absolutePath.asUri()

fun File.getMediaDuration(context: Context): Long {
    if (!exists()) return 0
    val retriever = MediaMetadataRetriever()
    retriever.setDataSource(context, uri)
    val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
    retriever.release()

    return duration.toLongOrNull() ?: 0
}

这里不是必需的,但通常对附加的Uri扩展很有帮助

val Uri?.exists get() = if (this == null) false else asFile().exists()

fun Uri.asFile(): File = File(toString())