我见过很多类似的问题,但我有一个区别,我需要在 java 中而不是在 c/c++ 中执行此操作,并且我需要它在 android 设备上运行。
我找到了一种使用“MediaMetadataRetriever”的方法。
但是我需要很长时间来分离帧(大约 1 秒到帧),我需要读取 600 帧,所以我只需要 10 分钟就可以在没有图像处理的情况下读取图像。
我想知道是否有另一种方法可以从视频中拆分帧,或操作 MediaMetadataRetriever 并使其快速工作。
非常感谢!
最佳答案
听起来您想使用 MediaCodec
解码器。有一些例子 here 。
特别是,如果您查看 DecodeEditEncodeTest 代码,checkVideoFile()
函数将先前创建的流解码为外部纹理,然后使用 OpenGL ES 对其进行操作。 (要从 .mp4 文件执行此操作,您需要通过 MediaExtractor
访问它。)MediaMetadataRetriever#getFrameAtTime()
真正用于提取缩略图,并不特别适合提取大量帧。
更新: 现在有 sample code 用于使用 MediaExtractor
、 MediaCodec
和 GLES (API 16+) 提取视频帧。