从android中的视频中提取位图

问题描述 投票:9回答:3

我试图从视频中提取所有帧。 通过以下代码我想获取视频的前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; }
}

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

android video bitmap media
3个回答
2
投票

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

还有一个纯Java库,JCodec,但速度较慢,去年我使用它时,提取帧的颜色被扭曲了。


0
投票

dataFrame以毫秒为单位获取数据,但在for循环中增加.001毫秒。

    for(int i=1000000;i<millis*1000;i+=1000000) // for incrementing 1s use 1000
    {
       bArray.add(mRetriever.getFrameAtTime(i, 
                       MediaMetadataRetriever.OPTION_CLOSEST_SYNC));
    }

像上面那样改变它。以上是创建所需内容的示例。我也回答了它here


0
投票

从Android 9.0(API级别28)开始,MediaMetadataRetriever有一个getFrameAtIndex (int frameIndex)方法,它接受所需帧的从零开始的索引并返回一个位图。

https://developer.android.com/reference/android/media/MediaMetadataRetriever.html#getFrameAtIndex(int)

© www.soinside.com 2019 - 2024. All rights reserved.