2

这是我正在使用的功能:

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是视频时间的路径= videoview.getCurrentPosition();

问题是这个函数没有得到我需要得到的确切帧。在较长的视频(20 分钟)上,它会比在短视频(10-20 秒)中更准确。我有什么遗漏的吗,如果没有,我可以用什么来代替检索器?

4

5 回答 5

2

尝试不带选项使用 ...

retriever.getFrameAtTime(time * 1000);

我有同样的问题,在我做了这个修改之后它工作得很好。

于 2014-04-28T11:35:08.830 回答
1

该功能有一个错误,它显然不适用于小型视频并且非常不可靠,我最近在这里问了这个问题SO看到这个帖子,但没有得到正确的答案,所以我做了很多研究并使用FFMPEG相反,使用FFMPEG我能够提取精确到毫秒的视频帧,还请注意,在手机上提取帧的过程很慢,对于一个大于 50Mb 的大视频,我通常需要 2 分钟才能提取我想要的内容。

于 2013-02-11T16:14:47.527 回答
1
retriever.getFrameAtTime(second* 1000*1000);

它需要微秒而不是毫秒。

于 2015-09-11T10:44:52.010 回答
0

是的,我同意retriever.getFrameAtTime 不准确。

getFrameAt替代Android 方法的替代解决方案MediaMetadataRetrieverAV_FrameCapture用于MediaCodec解码视频帧并将OpenGL视频帧转换为 RGB 位图。由于 AndroidMediaMetadataRetriever不保证调用时返回结果,因此可以使用getFrameAtTime此AV_FrameCapture 准确提取一帧视频。

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

于 2020-03-11T10:09:27.823 回答
-3
ImageView imageView1=(ImageView)findViewById(R.id.imageView1);

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

imageView1.setImageBitmap(bm);
于 2014-11-24T06:40:59.170 回答