每秒检索帧数-Android/MediaMetadataRetriever
我希望使用MediaMetadataRetriever每秒检索5秒视频中的10帧,并将其存储到Arraylist中。我对使用ffmpeg不感兴趣 目前,我的应用程序正在创建50幅静止图像——每秒10帧相同的帧,而不是每秒10帧不同的帧每秒检索帧数-Android/MediaMetadataRetriever,android,video,bitmap,metadata,media,Android,Video,Bitmap,Metadata,Media,我希望使用MediaMetadataRetriever每秒检索5秒视频中的10帧,并将其存储到Arraylist中。我对使用ffmpeg不感兴趣 目前,我的应用程序正在创建50幅静止图像——每秒10帧相同的帧,而不是每秒10帧不同的帧 public class FrameCollector { MediaMetadataRetriever mmr; double fps; double duration; long counter = 0; long incrementer; public
public class FrameCollector {
MediaMetadataRetriever mmr;
double fps;
double duration;
long counter = 0;
long incrementer;
public FrameCollector(String path, Context context)
{
try
{
mmr = new MediaMetadataRetriever();
mmr.setDataSource(path);
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
String fpsString = pref.getString("prefFPS", "10");
fps = Double.parseDouble(fpsString);
incrementer = (long) (1000000 / fps);
String stringDuration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
duration = Double.parseDouble(stringDuration) * 1000;
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
public ArrayList<Bitmap> getBitmaps()
{
try
{
ArrayList<Bitmap> bitFrames = new ArrayList<Bitmap>();
Bitmap b = mmr.getFrameAtTime(counter);
while (counter < duration && b != null)
{
bitFrames.add(b);
counter += incrementer;
b = mmr.getFrameAtTime(counter);
}
return bitFrames;
}
catch (Exception ex)
{
ex.printStackTrace();
return null;
}
}
}
公共类FrameCollector{
MediaMetadataRetriever mmr;
双fps;
双倍持续时间;
长计数器=0;
长递增器;
公共FrameCollector(字符串路径、上下文)
{
尝试
{
mmr=新的MediaMetadataRetriever();
mmr.setDataSource(路径);
SharedReferences pref=PreferenceManager.GetDefaultSharedReferences(上下文);
字符串fpstring=pref.getString(“prefFPS”,“10”);
fps=Double.parseDouble(fpstring);
递增器=(长)(1000000/fps);
String stringDuration=mmr.extractMetadata(MediaMetadataRetriever.METADATA\u KEY\u DURATION);
持续时间=Double.parseDouble(stringDuration)*1000;
}
捕获(例外情况除外)
{
例如printStackTrace();
}
}
公共ArrayList getBitmaps()
{
尝试
{
ArrayList位帧=新的ArrayList();
位图b=mmr.getFrameAtTime(计数器);
while(计数器
根据@Michael的评论
“getFrameAtTime(计数器)是getFrameAtTime(计数器,选项\u最近的\u同步)的包装器,这意味着它将仅读取关键帧。请尝试改用getFrameAtTime(计数器,选项\u最近的)作为包装器”
getFrameAtTime(计数器)
是getFrameAtTime(计数器,选项\u最近的\u同步)
的包装器,这意味着它将只读取关键帧。尝试改用getFrameAtTime(计数器,选项_近邻)
。非常感谢@Michael,它工作得非常好!事实上,我已经尝试使用上面的代码从视频文件中获取所有帧,但我只重复获取了第一帧。我的视频持续时间为127040(2:07秒)。将视频划分为32帧可以查看所有32帧图像,但所有图像都是相同的。我已经尝试了很多次使用getFrameAtTime(药剂)修复它但是完全没有用,我不知道哪里出了问题,所以你能通过完整的源代码帮助我吗?我应该在AndroidManifest中包含任何东西吗