英文:
Calculating video duration take too much time
问题
从我的ArrayList中,我尝试在Recycler视图中显示视频文件的名称和持续时间
,当我仅显示名称时,没有延迟,但是当我尝试显示名称,持续时间
时,就会有一些延迟。
这种延迟仅在大约15到20个文件时发生。
那么,我如何更快地计算视频文件的持续时间。
以下是我所做的。
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
中只有文件路径,没有索引。
英文:
From my arraylist am trying to display video file name, and duration
inRecycler view
when i display only name there is no delay, But when i try to display name, duration
it take a while.
the delay happen with just 15 to 20 files.
> 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.
答案1
得分: 0
以下是翻译好的部分:
你可以尝试不为每个文件创建新的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;
}
}
我不确定,但认为这可能会有所帮助。
英文:
You can try not create new element of FFmpegMediaMetadataRetriever for each file and pass it as parameter in function. Create it outside of for loop:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论