计算视频持续时间需要太多时间

Calculating video duration take too much time

我的 arraylist 试图在 Recycler view 中显示视频文件 name, and duration 当我只显示名称时没有延迟,但是当我尝试显示 name, duration 时需要一段时间.

只有 15 到 20 个文件会出现延迟。

So how do i calculate video file duration faster.

这就是我所做的。

String folderName = bundle.getString("folderName");
        setTitle(folderName);

        for (int i = 0; i < Constant.allMediaList.size(); i++) {
            if (folderName.equals(new File(String.valueOf(Constant.allMediaList.get(i))).getParentFile().getName())) {
                String fileName = FilenameUtils.getBaseName(Constant.allMediaList.get(i).getAbsolutePath());
                String duration = getDuration(Constant.allMediaList.get(i).getAbsolutePath(), context);
                String path = Constant.allMediaList.get(i).getAbsolutePath();
                videosPath.add(new VideoModel(fileName, duration, path));
            }
        }


public static String getDuration(String absolutePathThumb, Context context) {
    try{
        FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
        retriever.setDataSource(context , Uri.parse(absolutePathThumb));
        String time = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);
        long timeInMillisec = Long.parseLong(time);
        return convertMillieToHMmSs(timeInMillisec);
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
}

以上是试图获取文件持续时间和名称的内容。我做错了什么?

而我的 ArrayList 只是文件路径,没有索引。

您可以尝试不为每个文件创建新的 FFmpegMediaMetadataRetriever 元素并将其作为参数传递给函数。在 for 循环之外创建它:

public static String getDuration(String absolutePathThumb, Context context, FFmpegMediaMetadataRetriever retriever) {
    try{
        retriever.setDataSource(context , Uri.parse(absolutePathThumb));
        String time = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);
        long timeInMillisec = Long.parseLong(time);
        return convertMillieToHMmSs(timeInMillisec);
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
}

我不确定,但我认为它可能有所帮助。