提取Android中的所有视频帧

时间:2014-03-27 10:11:37

标签: android video camera frame photo

我录制的视频时间有限。现在我想获取所有视频帧。我使用下面的代码,并使用它,我能够得到帧,但我没有得到所有的视频帧。重复3到4帧然后我有一个不同的帧。但是众所周知,我们可以在一秒钟内获得25-30帧来显示流畅的视频。如何获得所有帧。

 for (int i = 0; i < 30; i++) {

                    Bitmap bArray = mediaMetadataRetriever.getFrameAtTime(
                            1000000 * i,
                            MediaMetadataRetriever.OPTION_CLOSEST);

                    savebitmap(bArray, 33333 * i);

                }

我不想使用NDK。我得到了这个链接,不知道&#34; argb8888&#34;的价值应该是什么。我在这里得到错误。任何人都可以解释如何做到这一点。 Getting frames from Video Image in Android

3 个答案:

答案 0 :(得分:7)

之前我遇到过同样的问题而且Android的 MediaMetadataRetriever 似乎没有被用于此任务,因为它没有很好的精确度。 我在android studio中使用了一个名为"FFmpegMediaMetadataRetriever"的库:

  1. 在模块app:

    下的build.graddle中添加此行

    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.1'

  2. 重建您的项目。

  3. 使用FFmpegMediaMetadataRetriever类来抓取更高的帧 精度:

    FFmpegMediaMetadataRetriever med = new FFmpegMediaMetadataRetriever();

    med.setDataSource(“您的数据源”);

  4. 在你的循环中你可以使用:

    抓取框架
     Bitmap bmp = med.getFrameAtTime(i*1000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
    

答案 1 :(得分:2)

要从视频中获取图像帧,我们可以使用ffmpeg。为了在android中集成FFmpeg,我们可以使用预编译的库,如ffmpeg-android

要从视频中提取图像帧,我们可以在命令

下使用
  

String [] complexCommand = {“ - yy”,“ - i”,inputFileAbsolutePath,“ - an”,   “-r”,“1/2”,“ - s”,“”+ startMs / 1000,“ - t”,“”+(endMs - startMs)   / 1000,outputFileAbsolutePath};

下面,

-y

覆盖输出文件

-i

ffmpeg从-i选项

指定的任意数量的输入“文件”中读取

-an

禁用录音。

-r

设置帧速率

-ss

寻求定位

-t

限制从输入文件中读取数据的持续时间

这里代替inputFileAbsolutePath,您必须指定要从中提取图像的视频文件的绝对路径。

有关完整代码,请查看我的存储库中的this。内部extractImagesVideo()方法我正在运行从视频中提取图像的命令。

有关整合ffmpeg库和使用ffmpeg命令编辑视频的完整教程,请查看我在博客上撰写的this帖子。

答案 2 :(得分:1)

你需要这样做:

  1. 解码视频。
  2. 至少以24幅图像/秒的速度呈现解码图像。一世 假设您可以跳过此步骤。
  3. 保存已解码的图像。
  4. 解码视频似乎是最具挑战性的一步。人们和公司花了数年时间为各种视频格式开发编解码器(编码器/解码器)。

    使用此库JMF for FFMPEG