从Java中的视频/视频文件中提取/提取图像/图像序列的最佳方法

时间:2012-12-27 15:06:17

标签: java image video ffmpeg sequence

嗯,有FFMPEG和一些Java绑定和包装器,但我需要为每个特定平台分配FFMPEG的正确二进制文件。

是否有任何普通的Java解决方案或库没有任何依赖关系,如FFMPEG,用于将视频文件转换为图像序列?

FFMPEG,XUGGLER或JMF(废弃)等解决方案并不合适。真的没有纯Java解决方案吗?

至少对于特定的视频编解码器/文件?

我只想将视频文件中的图像提取到jpeg / png文件并将其保存到磁盘

3 个答案:

答案 0 :(得分:3)

  

[从视频流中提取图像]真的没有纯Java解决方案吗?

我们来看看。你必须:

  • 解码视频。
  • 至少以24幅图像/秒的速度呈现解码图像。我想你可以跳过这一步。
  • 保存已解码的图像。

解码视频似乎是最具挑战性的一步。人们和公司花了数年时间为各种视频格式开发编解码器(编码器/解码器)。

SourceForge上有一个项目JMF wrapper for ffmpeg,它开发了一些纯Java视频编解码器。也许您可以查看他们的源代码,看看如何为自己开发Java视频编解码器。

如果愿意,您可以查找其他纯Java视频编解码器。

答案 1 :(得分:2)

以下编解码器的纯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>

对于最新版本,请参阅here

答案 2 :(得分:2)

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();
        }


    }
}