这是我正在使用的功能:
public Bitmap getVideoFrame(String FD, long time) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(FD);
return retriever.getFrameAtTime(time * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (RuntimeException ex) {
ex.printStackTrace();
} finally {
try {
retriever.release();
} catch (RuntimeException ex) {
}
}
return null;
}
其中:FD是视频的路径 time = videoview.getCurrentPosition();
问题是这个函数没有得到我需要得到的确切帧。在较长的视频(20分钟)上,它将比短视频(10-20秒)更准确。是否有我缺少的东西,如果没有,我可以使用什么而不是检索器?
答案 0 :(得分:1)
该功能存在一个错误,它显然不适用于小型视频并且非常不可靠,我最近在SO
,see this post上提出了这个问题,但没有得到正确答案,所以我进行了大量的研究并使用了FFMPEG
,使用FFMPEG
我能够将视频帧提取精确到毫秒,同时请注意,在移动电话上提取帧的过程很慢,一个大视频,即超过50Mb,我花了2分钟来提取我想要的东西。
答案 1 :(得分:1)
尝试不使用选项...
retriever.getFrameAtTime(时间* 1000);
我有同样的问题,在我做了这个修改后,它完美无缺。
答案 2 :(得分:0)
retriever.getFrameAtTime(second* 1000*1000);
它需要微秒而不是毫秒。
答案 3 :(得分:0)
是的,我同意Retrieve.getFrameAtTime不正确。
替代Android getFrameAt
的{{1}}方法的替代解决方案。 AV_FrameCapture 使用MediaMetadataRetriever
解码视频帧,并使用MediaCodec
将视频帧转换为RGB位图。由于Android OpenGL
不能保证在调用MediaMetadataRetriever
时返回结果,因此该 AV_FrameCapture可用于准确提取视频帧。
答案 4 :(得分:-1)
ImageView imageView1=(ImageView)findViewById(R.id.imageView1);
Bitmap bm=ThumbnailUtils.createVideoThumbnail(Environment.getExternalStorageDirectory() + "/videocapture.3gp",Thumbnails.MICRO_KIND);
imageView1.setImageBitmap(bm);