Java 在Android中从视频中获取精确帧

Java 在Android中从视频中获取精确帧,java,android,ffmpeg,jcodec,mediametadataretriever,Java,Android,Ffmpeg,Jcodec,Mediametadataretriever,因此,我有一个用户可以拍摄视频的应用程序,我想从文件中抓取特定的帧。当我使用方法MediaMetaDataRetriever.getFrameAtTime()时,它每秒钟只能提取一帧,但我也希望抓取秒与秒之间的帧。我还尝试在我的项目中实现Jcodec,以获得正确的框架: FrameGrab.getFrame(新文件(VideoFileToRetree.getVideoFile()),当前帧), 然而,无论我在currentFrame中输入什么数字,图像总是返回视频的第一帧。有没有办法不使用ffm

因此,我有一个用户可以拍摄视频的应用程序,我想从文件中抓取特定的帧。当我使用方法
MediaMetaDataRetriever.getFrameAtTime()
时,它每秒钟只能提取一帧,但我也希望抓取秒与秒之间的帧。我还尝试在我的项目中实现Jcodec,以获得正确的框架:

FrameGrab.getFrame(新文件(VideoFileToRetree.getVideoFile()),当前帧),


然而,无论我在currentFrame中输入什么数字,图像总是返回视频的第一帧。有没有办法不使用ffmpeg就执行类似的操作?如果有人知道答案,我们将不胜感激。

如果您使用的是
MediaMetaDataRetriever
,那么您可能也在使用来自同一框架的
MediaPlayer

如果是这种情况,
MediaPlayer
提供了方法
seekTo(millis)

不幸的是,将轨迹移动到时间戳而不是帧,但是如果知道帧速率,您应该能够计算出要移动到的正确位置

另外:当查看
getFrameAtTime
时,它所采用的参数是'uSecs',我认为是微秒-这意味着该方法每秒可以返回远不止一帧-您看到的问题可能是,如果在精确的微秒处没有帧,它将采用附近的帧


这意味着,如果您的视频速度为30fps,则每33.333 uSecs将有一帧,因此在调用
getFrameAtTime

时,请确保使用接近该大小的间隔。我最终使用了一个FFmpeg android库,可在此处找到:

我也有同样的问题


MediaMetaDataRetriever.getFrameAtTime()
可以在API 27中按需要工作。

您可以使用相同的库媒体元数据
**retriever.MediaMetaDataRetriever.getFrameAtTime(选项)**

您需要使用
OPTION\u-CLOSEST
而不是
OPTION\u-CLOSEST\u-SYNC。OPTION\u-CLOSEST\u-SYNC
OPTION\u-CLOSEST
快,但它会在一秒钟内用30帧替换第一帧<与
OPTION\u CLOSEST\u SYNC
相比,code>OPTION\u CLOSEST\u SYNC
速度较慢,但效果很好。

我尝试过这个方法,但它只会跳转到每隔一秒钟存在的关键帧。有没有办法忽略这一点?我不是很熟悉tbh,我只是看了一下源代码,因为问题很有趣,对不起,你能控制提供的视频类型吗?也许另一种格式使用不同的编解码器会提供更好的效果。这是我制作的自定义相机的视频。你使用了预构建的
.aar
文件吗?我刚刚发布了一个关于这个的问题-