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

6

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

是否有任何纯Java解决方案或库,没有像FFMPEG这样的依赖项,用于将视频文件转换为图像序列?

像FFMPEG、XUGGLER或JMF(已经被放弃)这样的解决方案不适合。真的没有纯Java解决方案吗?

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

我只想从视频文件中提取图像到jpeg/png文件并将它们保存到磁盘上。


由于有如此多不同的编码可用,我认为ffmpeg是您的选择。 - micha
可是我需要二进制文件,而且它不是作为纯Java解决方案提供的。 - user753676
这里有Jave - asgoth
Java 需要为每个平台提供特定的二进制文件,jffmpeg(真正的 Java 端口?)可能是一个解决方案,但一定会有更好的选择。 - user753676
这个 Stack Overflow 的问题可能会有所帮助:https://dev59.com/ymkw5IYBdhLWcg3wJHCF - Gilbert Le Blanc
3个回答

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


    }
}

这将生成mp4视频中的所有视频帧! - kousik Mridha
1
这不取决于OpenCV和其他二进制文件和库吗? - user753676

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>

最新版本请参见这里


我尝试了他们的示例,但是出现了NullPointerException,不知道原因。有人可以帮忙吗?http://stackoverflow.com/questions/19344051/nullpointerexception-in-framegrab-getframe - Matt
如果你需要快速解决方案,我建议不要使用jcodec。最新版本0.1.10获取一个帧需要大约700毫秒。它肯定不适合视频播放。 - Jeroen Vervaeke

2
真的没有纯Java解决方案来[从视频流中提取图像]吗?
让我们看看。您需要:
解码视频。
以至少24帧/秒的速度呈现解码后的图像。我想您可以跳过此步骤。
保存解码后的图像。
似乎解码视频是最具挑战性的步骤。人们和公司花费了多年时间开发各种视频格式的编解码器(编码器/解码器)。
SourceForge上有一个项目,名为JMF wrapper for ffmpeg,已经开发了一些纯Java视频编解码器。也许您可以查看他们的源代码,了解如何为自己开发Java视频编解码器。
如果您愿意,还可以寻找其他纯Java视频编解码器。

有没有一种特定的编解码器最适合?MJPEG?任何FFmpeg封装都不能使用。 - user753676
@Daniel Ruf:能够准确解码您的视频?您需要为每个要处理的视频编码使用一个视频编解码器。正如我在我的答案中所说,包装项目生成了一些纯Java视频编解码器。这些纯Java视频编解码器就是您想要的。 - Gilbert Le Blanc
我想为第一个小版本选择最佳编码方式,考虑使用运动JPEG。但是看起来它没有标准化。 - user753676
1
@Daniel Ruf:在这里列出的格式中任选一种:http://jffmpeg.sourceforge.net/formats.html - Gilbert Le Blanc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接