我录制的视频时间有限。现在我想获取所有视频帧。我使用下面的代码,并使用它,我能够得到帧,但我没有得到所有的视频帧。重复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
答案 0 :(得分:7)
之前我遇到过同样的问题而且Android的 MediaMetadataRetriever
似乎没有被用于此任务,因为它没有很好的精确度。
我在android studio中使用了一个名为"FFmpegMediaMetadataRetriever"
的库:
在模块app:
下的build.graddle中添加此行 compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.1'
重建您的项目。
使用FFmpegMediaMetadataRetriever
类来抓取更高的帧
精度:
FFmpegMediaMetadataRetriever med = new FFmpegMediaMetadataRetriever();
med.setDataSource(“您的数据源”);
在你的循环中你可以使用:
抓取框架 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)
你需要这样做:
解码视频似乎是最具挑战性的一步。人们和公司花了数年时间为各种视频格式开发编解码器(编码器/解码器)。
使用此库JMF for FFMPEG。