所以我有一个应用程序可以在其中拍摄视频,我想从文件中获取特定的帧。当我使用方法MediaMetaDataRetriever.getFrameAtTime()
时,它只能每秒提取一个帧,但是我也想在秒之间抓住框架。我还尝试将JCODEC实现到我的项目中以获取正确的帧:
FrameGrab.getFrame(new File(videoFileToRetreive.getVideoFile()), currentFrame);
,
但是,无论我在CurrentFrame中投入了什么号码,图像始终返回视频的第一帧。有没有办法在不使用FFMPEG的情况下执行这样的事情?如果有人知道答案,将不胜感激。
我最终使用了这里找到的ffmpeg android库:https://github.com/wseemann/ffmpegmediametadatataretriever
大概是在使用MediaMetaDataRetriever
的情况下,您也在同一框架中使用MediaPlayer
。
如果是这种情况,MediaPlayer
提供了方法seekTo(millis)
不幸的是,寻求将轨道移动到 timestamp 而不是框架,但是如果您知道帧速率,您应该能够解决正确的位置。
另外:查看getFrameAtTime
时,所采用的参数是'USECS',我将其视为微秒 - 这意味着该方法可以每秒返回超过一个帧 - 您看到的问题可能是因为如果有存在的问题是因为在那个精确的微秒处没有框架,它需要附近的
这意味着,如果您的视频具有30fps,则每33.333 USEC都会有一个帧,因此请确保在调用getFrameAtTime
我有同样的问题。
MediaMetaDataRetriever.getFrameAtTime()
在API 27中按照您的需求工作。
您可以使用相同的库元数据**retriver.MediaMetaDataRetriever.getFrameAtTime(OPTION_CLOSEST)**
。您需要使用OPTION_CLOSEST
而不是OPTION_CLOSEST_SYNC.OPTION_CLOSEST_SYNC
比OPTION_CLOSEST
快,但它在一秒钟内用30帧代替了每个第一帧。与OPTION_CLOSEST_SYNC
相比,OPTION_CLOSEST
速度很慢,但效果很好。