3

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

拉杰什。

4

3 回答 3

10

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

于 2013-09-02T12:31:28.500 回答
2

您不需要创建 MediaPlayer。我制作了一项功能,可以为您提供视频文件存储的 android 设备的持续时间。

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

如果您对此有任何疑问,请告诉我。

于 2016-08-04T12:12:43.683 回答
0

不要使用媒体播放器!效率低下

改为MediaMetadataRetriever获取您需要的元数据

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())
于 2020-01-23T03:17:02.967 回答