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;

    }
}

此方法总是返回相同的帧

4

3 回答 3

11

我不知道你的视频有多长,但是用 long var 作为 time for 的时间getTimeAtFrame必须用MICRO秒表示

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

于 2013-04-23T15:06:49.300 回答
4

您将不得不使用 FFMPEG 之类的东西来获取帧。

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

几个起点:

http://ffmpeg.org/

用于 android 的 ffmpeg(使用教程:“ffmpeg 和 Android.mk”)

祝你好运!

于 2012-05-12T17:49:04.360 回答
2

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

于 2017-08-24T09:32:26.340 回答