【问题标题】:fastest way to split video into frames java将视频分割成帧的最快方法java
【发布时间】:2013-10-23 12:59:05
【问题描述】:

我见过很多类似的问题,但我有一个不同之处,我需要在 java 中而不是在 c/c++ 中执行此操作,并且我需要它在 android 设备上工作。

我找到了一种使用“MediaMetadataRetriever”的方法。

但是分离帧需要很长时间(每帧约 1 秒),我需要读取 600 帧,所以我只需要 10 分钟就可以读取没有图像处理的图像。

我想知道是否有其他方法可以从视频中分割帧,或者操作 MediaMetadataRetriever 并使其快速运行。

非常感谢!

【问题讨论】:

  • 查看this关于如何使用ffmpeg从视频文件中提取图像帧的答案。它很快..

标签: java android opencv


【解决方案1】:

听起来您想使用MediaCodec 解码器。有一些例子here

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

MediaMetadataRetriever#getFrameAtTime() 真正用于提取缩略图,并不特别适合提取大量帧。

更新:现在有 sample code 用于使用 MediaExtractorMediaCodec 和 GLES(API 16+)提取视频帧。

【讨论】:

  • 有没有办法下载所有的 cts 类并将其用作库?我可以将输出转换为 openCV 矩阵吗?
  • (1) 假设MediaCodec 支持视频格式,所有工作都由硬件或驱动程序完成,通过您使用glReadPixels 将数据复制到缓冲区中。 (2) CTS是一致性测试的集合;最后我检查了一下,APK 大约有 100MB。所以你绝对不想要all CTS 类。 :-) 最好只挑选你需要的部分。该页面上的其他一些示例(例如 EncodeAndMuxTest)就是这样编写的。 (3)我没用过OpenCV; glReadPixels 返回简单的 RGBA(如果您需要 YUV,这可能会很烦人)。
  • 其实我需要一个灰度矩阵。我根本不需要图像。在我使用 glReadPixels 函数后,计算时间又太长了。
  • API 级别 16 起才支持,你有 api 级别 11 及以上的想法吗?
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多