0

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

FrameGrab.getFrame(new File(videoFileToRetreive.getVideoFile()), currentFrame);,

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

4

4 回答 4

1

我最终使用了一个在这里找到的 FFmpeg android 库:https ://github.com/wseemann/FFmpegMediaMetadataRetriever

于 2017-02-22T20:47:20.270 回答
0

据推测,如果您正在使用MediaMetaDataRetriever,那么您也在使用MediaPlayer同一个框架。

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

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

另外:当查看getFrameAtTime参数时,它采用的参数是“uSecs”,我认为它是微秒 - 这意味着该方法每秒可以返回超过一帧 - 您看到的问题可能是因为如果没有帧精确的微秒,它需要一个附近的帧

这意味着如果你的视频有 30fps,每 33.333 uSecs 就会有一个帧,所以在调用时请确保使用接近该大小的间隔getFrameAtTime

于 2017-02-22T20:00:36.253 回答
0

我也有同样的问题。

MediaMetaDataRetriever.getFrameAtTime()在 API 27 中随心所欲地工作。

于 2018-05-31T04:03:14.250 回答
0

您可以使用相同的库媒体元数据**retriver.MediaMetaDataRetriever.getFrameAtTime(OPTION_CLOSEST)**。您需要使用OPTION_CLOSEST而不是比 OPTION_CLOSEST_SYNC.OPTION_CLOSEST_SYNC它更快,OPTION_CLOSEST但它会在每秒内将第一帧替换为 30 帧。OPTION_CLOSEST与之相比速度较慢,OPTION_CLOSEST_SYNC但​​工作正常。

于 2021-02-20T18:13:39.457 回答