检索每秒帧数 - Android/MediaMetadataRetriever
问题描述:
我期待在5秒钟的视频中使用MediaMetadataRetriever检索10帧每秒,并将它们存储到Arraylist中。我对使用ffmpeg不感兴趣。检索每秒帧数 - Android/MediaMetadataRetriever
目前我的应用程序正在创建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;
}
}
}
答
按照从@迈克尔
评论“getFrameAtTime(计数器)是getFrameAtTime(计数器,OPTION_CLOSEST_SYNC)的包装,这意味着将只读取关键帧。尝试使用getFrameAtTime(计数器,OPTION_CLOSEST)代替“
'getFrameAtTime(counter)'是'getFrameAtTime(counter,OPTION_CLOSEST_SYNC)'的包装,意味着它只会读取关键帧。尝试使用'getFrameAtTime(counter,OPTION_CLOSEST)'代替。 – Michael 2013-02-28 13:47:04
非常感谢@迈克尔,完美的工作! – Ledgey1101 2013-02-28 15:08:20
其实我试过你的上面的代码来获取视频文件中的所有帧,但我只获得第一帧frames.my视频持续时间是127040(2:07秒)将视频分为32帧可以查看所有32个图像,但都是相同的图像我想了很多与getFrameAtTime(药剂)修复它,但没有用到所有确切的我不知道它出错的地方,所以你可以帮助我的完整的源代码应该包括任何东西在AndroidManifest – Manoj 2014-05-21 16:08:43