好的,有FFMPEG和一些Java绑定和包装器,但我需要为每个特定平台分发正确的FFMPEG二进制文件。
是否有任何纯Java解决方案或库,没有像FFMPEG这样的依赖项,用于将视频文件转换为图像序列?
像FFMPEG、XUGGLER或JMF(已经被放弃)这样的解决方案不适合。真的没有纯Java解决方案吗?
至少对于特定的视频编解码器/文件呢?
我只想从视频文件中提取图像到jpeg/png文件并将它们保存到磁盘上。
好的,有FFMPEG和一些Java绑定和包装器,但我需要为每个特定平台分发正确的FFMPEG二进制文件。
是否有任何纯Java解决方案或库,没有像FFMPEG这样的依赖项,用于将视频文件转换为图像序列?
像FFMPEG、XUGGLER或JMF(已经被放弃)这样的解决方案不适合。真的没有纯Java解决方案吗?
至少对于特定的视频编解码器/文件呢?
我只想从视频文件中提取图像到jpeg/png文件并将它们保存到磁盘上。
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();
}
}
}
以下编解码器有纯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"));
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.1.3</version>
</dependency>
最新版本请参见这里。