使用Java分割视频成帧的最快方法

4
我看到了很多类似我的问题,但我需要用Java而不是C/C++来解决,并且需要在Android设备上运行。 我找到了一种使用“MediaMetadataRetriever”方法来实现的方式。 但是将帧分离出来太耗时(每秒1帧),我需要读取大约600帧,所以仅读取图像就需要10分钟,还没有进行图像处理。 我想知道是否有其他方法可以从视频中分离出帧,或者如何操纵MediaMetadataRetriever使其快速工作。 非常感谢!

请查看这个答案,了解如何使用FFmpeg从视频文件中提取图像帧。它非常快速。 - Android Developer
1个回答

3

看起来您想使用MediaCodec解码器。这里有一些示例链接

特别地,如果您查看DecodeEditEncodeTest代码,checkVideoFile()函数将预先创建的流解码到外部纹理中,然后使用OpenGL ES进行操作。(要从.mp4文件中执行此操作,您需要通过MediaExtractor访问它。)

MediaMetadataRetriever#getFrameAtTime()实际上是用于提取缩略图,并不适合提取大量帧。

更新:现在有示例代码可使用MediaExtractorMediaCodec和GLES(API 16+)提取视频帧。


有没有一种方法可以下载所有的 CTS 类并将其用作库? 并且我能将输出转换为 OpenCV 矩阵吗? - user2235615
(1) 假设MediaCodec支持视频格式,则所有工作都由硬件或驱动程序完成,直到使用glReadPixels将数据复制到缓冲区为止。 (2) CTS是一组遵从性测试;上次我检查时,APK大约为100MB。因此,您肯定不需要全部 CTS类。 :-) 最好只选择您需要的部分。该页面上的其他示例(例如EncodeAndMuxTest)就是这样编写的。 (3) 我没有使用过OpenCV;glReadPixels返回简单的RGBA(如果您需要YUV,可能会很烦人)。 - fadden
实际上我需要一个灰度矩阵,根本不需要图像。而且在使用glReadPixels函数后,计算时间又太长了。 - user2235615
它仅支持API级别16及以上,你有关于API级别11及以上的想法吗? - Nativ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接