所以我有一个用户可以拍摄视频的应用,我想从文件中获取特定的帧。当我使用方法i
时,它每秒只能提取一帧,但我也希望在秒之间抓取帧。我还尝试将Jcodec实现到我的项目中以获取正确的框架:
MediaMetaDataRetriever.getFrameAtTime()
,
然而,无论我在currentFrame中输入什么数字,图像总是返回视频的第一帧。有没有办法在不使用ffmpeg的情况下执行这样的操作?如果有人知道答案,我们将不胜感激。
答案 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_SYNC
比 OPTION_CLOSEST
快,但它会在一秒钟内用 30 帧替换每个第一帧。 OPTION_CLOSEST
与 OPTION_CLOSEST_SYNC
相比速度较慢,但效果很好。