从android中的视频中提取位图

kri*_*pta 9 media video android bitmap

我试图从视频中提取所有帧.
通过以下代码我想获取视频的前30帧,但我只得到第一帧30次.

private ArrayList<Bitmap> getFrames(String path) {
    try {
        ArrayList<Bitmap> bArray = new ArrayList<Bitmap>();
        bArray.clear();
        MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
        mRetriever.setDataSource("/sdcard/myvideo.mp4");                    

        for (int i = 0; i < 30; i++) {
            bArray.add(mRetriever.getFrameAtTime(1000*i, 
                       MediaMetadataRetriever.OPTION_CLOSEST_SYNC));
        }
        return bArray;
    } catch (Exception e) { return null; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我如何从视频中获取所有帧?

Cri*_*ert 3

Android SDK 中的视频支持有限,并且 H264 编码视频的帧提取只能针对关键帧。为了提取任意帧,您需要使用像FFmpegMediaMetadataRetriever这样的库,它使用本机代码从视频中提取数据。它速度非常快,附带预编译的二进制文件(适用于 ARM 和 x86),因此您无需深入研究 C++ 和 makefile,在 Apache 2.0 下获得许可,并附带演示 Android 应用程序。

还有一个纯 Java 库JCodec ,但它速度较慢,并且当我去年使用它时,提取的帧的颜色失真。