每秒检索帧数-Android/MediaMetadataRetriever

每秒检索帧数-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

我希望使用MediaMetadataRetriever每秒检索5秒视频中的10帧,并将其存储到Arraylist中。我对使用ffmpeg不感兴趣

目前,我的应用程序正在创建50幅静止图像——每秒10帧相同的帧,而不是每秒10帧不同的帧

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中包含任何东西吗