好吧,有 FFMPEG 和一些 Java 绑定和包装器,但我需要为每个特定平台分发正确的 FFMPEG 二进制文件。
是否有任何没有任何依赖关系的普通 Java 解决方案或库,例如用于将视频文件转换为图像序列的 FFMPEG?
FFMPEG、XUGGLER 或 JMF(已废弃)等解决方案不适用。真的没有纯Java解决方案吗?
也许至少对于特定的视频编解码器/文件?
我只想将视频文件中的图像提取为 jpeg / png 文件并将它们保存到磁盘
[从视频流中提取图像] 真的没有纯 Java 解决方案吗?
让我们来看看。你必须:
看来解码视频将是最具挑战性的一步。人们和公司花费数年时间为各种视频格式开发编解码器(编码器/解码器)。
SourceForge 上有一个项目,它是 ffmpeg 的 JMF 包装器,它开发了一些纯 Java 视频编解码器。也许您可以查看他们的源代码并了解如何为自己开发 Java 视频编解码器。
如果您愿意,可以寻找其他纯 Java 视频编解码器。
以下编解码器有纯 Java 实现:H.264 (AVC)、MPEG 1/2、Apple ProRes、JPEG;以及以下文件格式:MP4(ISO BMF、QuickTime)、Matroska、MPEG PS 和 MPEG TS。
该库称为 JCodec ( http://www.jcodec.org )。
目前它的文档很少,但开发团队一直在努力解决这个问题。
以下是您如何简单地从 MP4 文件中获取帧的方法(示例来自他们的网站):
int frameNumber = 150;
BufferedImage frame = FrameGrab.getFrame(new File("filename.mp4"), frameNumber);
ImageIO.write(frame, "png", new File("frame_150.png"));
要将 JCodec 添加到您的项目中,您只需将以下内容添加到您的 pom.xml 中:
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.1.3</version>
</dependency>
有关最新版本,请参见此处。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import javax.imageio.ImageIO;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FrameGrabber.Exception;
public class Read{
public static void main(String []args) throws IOException, Exception, InterruptedException, ExecutionException
{
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber("C:/Users/Digilog/Downloads/Test.mp4");
frameGrabber.start();
IplImage i;
try {
for(int ii=0;ii<frameGrabber.getLengthInFrames();ii++){
i = frameGrabber.grab();
BufferedImage bi = i.getBufferedImage();
String path = "D:/Image/Image"+ii+".png";
ImageIO.write(bi,"png", new File(path));
}
frameGrabber.stop();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}