从Android中的视频中获取精确帧

时间:2017-02-22 19:37:14

标签: java android ffmpeg jcodec mediametadataretriever

所以我有一个用户可以拍摄视频的应用,我想从文件中获取特定的帧。当我使用方法i时,它每秒只能提取一帧,但我也希望在秒之间抓取帧。我还尝试将Jcodec实现到我的项目中以获取正确的框架:

MediaMetaDataRetriever.getFrameAtTime()

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

4 个答案:

答案 0 :(得分:1)

我最终使用了这里找到的FFmpeg安卓库:https://github.com/wseemann/FFmpegMediaMetadataRetriever

答案 1 :(得分:0)

大概如果您使用的是MediaMetaDataRetriever,那么您也在使用同一框架中的MediaPlayer

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

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

另外:查看getFrameAtTime所需的参数是' uSecs'我认为这是微秒 - 这意味着该方法每秒返回的帧数远远超过一帧 - 你看到的问题可能是因为如果在那个精确的微秒上没有帧,那么需要一个附近的帧

这意味着,如果您的视频有30fps,则每33.333 uSecs会有一个帧,因此请务必在调用getFrameAtTime时使用该大小的间隔

答案 2 :(得分:0)

我有同样的问题。

MediaMetaDataRetriever.getFrameAtTime()可以在API 27中使用。

答案 3 :(得分:0)

您可以使用相同的库媒体元数据 **retriver.MediaMetaDataRetriever.getFrameAtTime(OPTION_CLOSEST)**。 您需要使用 OPTION_CLOSEST 而不是 OPTION_CLOSEST_SYNC.OPTION_CLOSEST_SYNCOPTION_CLOSEST 快,但它会在一秒钟内用 30 帧替换每个第一帧。 OPTION_CLOSESTOPTION_CLOSEST_SYNC 相比速度较慢,但​​效果很好。