简体   繁体   English

计算视频时长花费太多时间

[英]Calculating video duration take too much time

From my arraylist am trying to display video file name, and duration in Recycler view when i display only name there is no delay, But when i try to display name, duration it take a while.从我的数组列表中,我试图在Recycler view显示视频文件name, and duration ,当我只显示name, duration时没有延迟,但是当我尝试显示name, duration需要一段时间。

the delay happen with just 15 to 20 files.延迟只发生在 15 到 20 个文件中。

So how do i calculate video file duration faster.那么我如何更快地计算视频文件的持续时间。

here is what i do.这就是我所做的。

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

Above is what am trying to get file duration and name.以上是我试图获取文件持续时间和名称的内容。 What am i doing wrong ?我究竟做错了什么 ?

and my ArrayList is just file path, nothing is indexed.我的ArrayList只是文件路径,没有索引。

You can try not create new element of FFmpegMediaMetadataRetriever for each file and pass it as parameter in function.您可以尝试不为每个文件创建 FFmpegMediaMetadataRetriever 的新元素,并将其作为函数中的参数传递。 Create it outside of for loop:在 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;
    }
}

I'm not sure but think it could help.我不确定,但认为它会有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM