retrievever.getFrameAtTime不准确,如何获取视频截图?

时间:2013-02-11 14:23:00

标签: android frame android-videoview screen-capture

这是我正在使用的功能:

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秒)更准确。是否有我缺少的东西,如果没有,我可以使用什么而不是检索器?

5 个答案:

答案 0 :(得分:1)

该功能存在一个错误,它显然不适用于小型视频并且非常不可靠,我最近在SOsee 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可用于准确提取视频帧。

https://stackoverflow.com/a/60633395/6676310

答案 4 :(得分:-1)

ImageView imageView1=(ImageView)findViewById(R.id.imageView1);

Bitmap bm=ThumbnailUtils.createVideoThumbnail(Environment.getExternalStorageDirectory() + "/videocapture.3gp",Thumbnails.MICRO_KIND);

imageView1.setImageBitmap(bm);