我正在开发一个应用程序,它获取本地视频文件并提取其帧并写入磁盘。我ffmpegmediametadataretriever
用来从视频中提取帧。我已经完成了以下代码
retriever.setDataSource(activity, uri);
Log.e("duration -> ", retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
long duration = Long.parseLong(retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
int everyNFrame = 1;
double frameRate = Double.parseDouble(retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_FRAMERATE));
Log.e("all metadata", retriever.getMetadata().getAll().toString());
long sec = Math.round(1000 * 1000 / (frameRate));
Bitmap bitmap;
// Bitmap bitmap2;
// Log.e(" timeskip ", sec + " ----------- " + (frameRate * 1000));
for (long i = 1000; i < duration * 1000; i += sec)
// for (long i = sec; i < duration * 1000 && !stopWorking; i += sec)//30*sec)
// for(int i=1000000;i<duration*1000 && !stopWorking;i+=300000)
{
bitmap = retriever.getFrameAtTime(i, FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC);
if (bitmap != null) {
try {
FileOutputStream out = new FileOutputStream(path + "/img_" + (i) + ".jpg");
Log.e("filename->", path + "/img_" + i + ".jpg");
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
bitmap.recycle();
Thread.sleep(75);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
它没有从视频中提取所有帧。对于某些视频,重复提取的帧。为不同的视频提取随机数量的帧。对于某些视频,提取了 70-80% 的帧,而对于某些仅提取了 15-20 帧。
我已经浏览了在 StackOverflow 和其他网站上可以找到的所有答案以找到解决方案,但问题就在那里。