计算视频持续时间需要太多时间
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;
}
}
我不确定,但我认为它可能有所帮助。
我的 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;
}
}
我不确定,但我认为它可能有所帮助。