我想用 java 从视频文件 (mov) 中获取帧样本 (jpeg)。是否有捷径可寻。当我在谷歌搜索时,我能找到的是从多个 jpg 制作 mov。我不知道,也许我找不到合适的关键字。
原文由 Nuri Tasdemir 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想用 java 从视频文件 (mov) 中获取帧样本 (jpeg)。是否有捷径可寻。当我在谷歌搜索时,我能找到的是从多个 jpg 制作 mov。我不知道,也许我找不到合适的关键字。
原文由 Nuri Tasdemir 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道原来的问题已经解决了,不过,我发布这个答案是为了防止其他人像我一样被卡住。
从昨天开始,我已经尝试了一切,我的意思是要做到这一点。所有可用的 Java 库要么已过时,不再维护,要么缺少任何类型的可用文档(严重吗??!?!)
我尝试了 JFM(陈旧且无用)、JCodec(没有任何文档)、JJMpeg(看起来很有前途,但由于缺乏 Java 类文档而使用起来非常困难和繁琐)、OpenCV 自动 Java 构建和一些其他库我不记得了。
最后,我决定看一下 JavaCV 的( Github 链接)类,瞧!它包含带有详细文档的 FFMPEG 绑定。
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.0</version>
</dependency>
事实证明,有一种非常简单的方法可以将视频帧从视频文件提取到 BufferedImage
并扩展为 JPEG 文件。 FFmpegFrameGrabber 类可以很容易地用于抓取单个帧并将它们转换为 BufferedImage
。代码示例如下:
FFmpegFrameGrabber g = new FFmpegFrameGrabber("textures/video/anim.mp4");
g.start();
Java2DFrameConverter converter = new Java2DFrameConverter();
for (int i = 0 ; i < 50 ; i++) {
Frame frame = g.grabImage(); // It is important to use grabImage() to get a frame that can be turned into a BufferedImage
BufferedImage bi = converter.convert(frame);
ImageIO.write(bi, "png", new File("frame-dump/video-frame-" + System.currentTimeMillis() + ".png"));
}
g.stop();
基本上,此代码转储视频的前 50 帧并将它们保存为 PNG 文件。好的是内部搜索功能适用于实际帧而不是关键帧(我在使用 JCodec 时遇到的问题)
您可以参考 JavaCV 的主页以了解更多有关可用于从网络摄像头等捕获帧的其他类的信息。希望这个答案对您有所帮助:-)
原文由 Maghoumi 发布,翻译遵循 CC BY-SA 4.0 许可协议
8 回答6.4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
Xuggler 完成了这项工作。他们甚至提供了一个示例代码,它完全符合我的需要。链接在下面
http://xuggle.googlecode.com/svn/trunk/java/xuggle-xuggler/src/com/xuggle/mediatool/demos/DecodeAndCaptureFrames.java
我修改了此链接中的代码,使其仅保存视频的第一帧。