如何在安卓设备中从视频文件中获取帧

12

MediaMetadataRetriever.getFrameAtTime()每次调用时总是返回相同的帧。请看我的代码:

private ArrayList<Bitmap> getFrames(String path){
    try {
        ArrayList<Bitmap> bArray = new ArrayList<Bitmap>();
        bArray.clear();
        MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
        mRetriever.setDataSource(getDataSource(path));

        for (int i = 3000; i <60000; i=i+5000) {
            bArray.add(mRetriever.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST_SYNC));

        }

        return bArray;
    } catch (Exception e) {
        // TODO: handle exception

        return null;

    }
}

这个方法总是返回相同的帧


1
这是您可以根据文档期望的行为:“此方法通过考虑给定选项(如果可能)来查找靠近给定时间位置的代表帧,并将其作为位图返回。返回值:包含代表视频帧的位图,如果无法检索到这样的帧,则可以为null。” - MH.
@MH。谢谢回复,我该如何从视频文件中获取帧?看看我的问题 - Ashish Dwivedi
2
三年过去了,我仍然在努力寻找解决方案...有人知道解决方案吗? - BST Kaal
两年后我也是一样的情况... - user-123
3个回答

11

我不知道你的视频有多长,但在作为getTimeAtFrame时间参数时,必须使用微秒表示时间

例如:1秒钟的视频有1000000微秒,如果使用非常短的时间段(像你这样),你必须非常幸运才能检索到只有一个视频帧!


1
我也遇到了这个问题,我确定它与使用的时间间隔无关。而且,OP的示例正在使用微秒。 - Léon Pelletier

4

如果视频存在服务器上,是否有同样的机会进行相同的操作? - Hardik K

2
Léon Pelletier是正确的。问题在于,MediaMetadataRetriever.getFrameAtTime()只能从视频中提取秒级别的关键帧。例如,如果一个视频大约有4秒,则只能获取4或5个不同的帧。要获取所有视频帧,请参考MediaCodec

1
我认为这不应该作为答案发布,你应该将其作为评论发布。 - Jaimesh
我的原始答案回答了相同框架的问题,并且我修改了它以便它也回答了标题。 - DeTac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接