问题 如何从android中的视频文件中获取帧


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;

    }
}

此方法始终返回相同的帧


6081
2018-04-17 09:50


起源

根据文档,您可以预期这种行为: “此方法通过考虑给定选项找到接近给定时间位置的代表帧 如果可能的话,并将其作为位图返回。返回:包含代表性视频帧的位图,如果无法检索到这样的帧,则该视频帧可以为空。“ - MH.
@MH。感谢回复如何从视频文件中获取帧。看看我的 题 - Dwivedi Ji
3年后,m仍然试图找到解决方案的难度......任何人都知道解决方案??? - BST Kaal
2年后更多相同... - Anatoly Anatoly


答案:


你将不得不使用像FFMPEG这样的东西来获取帧。

你将不得不使用NDK,并为Android编译FFMPEG;不幸的是,这不会很容易。

几个出发点:

http://ffmpeg.org/

ffmpeg for a android(使用教程:“ffmpeg和Android.mk”)

祝你好运!


3
2018-05-12 17:49



Ffmpeg会让您将项目的许可证更改为GPL .. - Nativ


我不知道你的视频有多长,但是在long var中使用的时间是 getTimeAtFrame 必须表达出来  秒

例如:1秒钟的视频有1000000美元,如果使用的时间很短(像你一样),你必须非常幸运地检索出你视频的第一帧!


10
2018-04-23 15:06



什么应该是for循环的值..请显示代码并解释它.. - Xar E Ahmer
我也遇到过这个问题,我肯定肯定它与使用的时间间隔无关。 OP的例子是使用微秒。 - Léon Pelletier


LéonPelletier是对的。问题是 MediaMetadataRetriever.getFrameAtTime() 只能从视频中提取关键帧 第二级。例如,如果视频大约有4秒钟,则只能获得4秒  或5个不同的帧。要获取所有视频帧,请参阅 MediaCodec


0
2017-08-24 09:32



我认为这不应该作为答案发布。你应该发表评论。 - Jaimesh
我原来的回答确实回答了相同的框架问题,我修改了它,所以它也响应了标题。 - DeTac