英文:
Is there any way to extract all the frames of a video in android studio?
问题
我正在开发一个应用程序,其中我正在提取视频的所有帧。我尝试了多种方法,但没有获得任何结果。所以有人可以建议如何做到这一点吗?
我已经尝试了在Android Studio中使用OpenCV和MediaMetadataRetriever。
英文:
I am working on an application in which i'm extracting all the frames of a video. I have tried multiple approaches but not able to get any results. So can anyone suggest how to do this?
I have tried OpenCV and MediaMetadataRetriever in android studio.
答案1
得分: 1
答案很简单,是的!您可以轻松地使用FmpegMediaMetadataRetriever库来实现这个。
在模块app的build.gradle中添加以下两行:
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-core:1.0.19'
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever native:1.0.19'
同步您的项目。
用法:
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(mUri);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST);
// 视频的持续时间
String time = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);
int duration = Integer.parseInt(time);
// 每隔一定时间获取一帧
int period = 1000000; // 每1秒获取1帧,如果需要更精确,请减小间隔
int len = duration / period;
List<Bitmap> frames = new ArrayList();
for (int i = 0; i < len; i++) {
Bitmap frame = mmr.getFrameAtTime(i * period, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // 在2秒处获取帧
frames.add(frame);
}
mmr.release();
// 在frames数组列表中,您可以自由操作帧
for (Bitmap frame : frames) {
// 在frame中,您可以自由操作帧
}
英文:
Simple answer is Yes !, you can do that easily using FmpegMediaMetadataRetriever library.
Add those two lines in your build.graddle under module app:
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever-core:1.0.19'
implementation 'com.github.wseemann:FFmpegMediaMetadataRetriever native:1.0.19'
Sync your project.
Usage:
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(mUri);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ALBUM);
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_ARTIST;
// duration of the video
String time = retriever.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);
int duration = Integer.parseInt(time);
//frame every selected period
int period = 1000000//each 1 second will get 1 frame, if you want more precision, minimise the period
int len = duration/period;
List<Bitmap> frames = ArrayList();
for(int i = 0; i<len; i++){
Bitmap frame = mmr.getFrameAtTime(i * period, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
frames.add(frame);
}
mmr.release();
//here you can do what ever you want from the frames arraylist
for(Bitmap frame: frames){
//here you can do what ever you want from the frame
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论