android - 从android中的视频中提取位图

标签 android video bitmap media

我正在尝试从视频中提取所有帧。
通过以下代码,我想获取视频的前 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 SDK 中的视频支持有限,H264 编码视频的帧提取只能用于关键帧。为了提取任意帧,您需要使用类似 FFmpegMediaMetadataRetriever 的库它使用 native 代码从视频中提取数据。它速度非常快,带有预编译的二进制文件(适用于 ARM 和 x86),因此您无需深入研究 C++ 和 makefile,在 Apache 2.0 下获得许可,并且带有一个演示 Android 应用程序。

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

关于android - 从android中的视频中提取位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114153/

相关文章:

android - 在android中解码流时保持图像质量

android - 将 H264 帧解码为字节数组

android - 使用文件 :///android_res/drawable/url works under eclipse but not in production

video - Gphoto2 拍摄视频并下载

c++ - ffmpeg:无法将 HLS 流保存到 MKV

video - ffmpeg 只设置宽度

winapi - 具有透明背景的 win32 菜单项位图

android - 从 Android 应用程序将小部件添加到主屏幕

javascript - 在android WebView中设置html页面填充

android - 使用数据绑定(bind)在自定义 View 中调用自定义方法