【问题标题】:best approach for extract / extracting images / image sequence from videos / video file in Java从Java中的视频/视频文件中提取/提取图像/图像序列的最佳方法
【发布时间】:2012-12-12 23:10:53
【问题描述】:

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

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

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

也许至少适用于特定的视频编解码器/文件?

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

【问题讨论】:

  • 由于有很多不同的编码可用,我认为 ffmpeg 是您的选择。
  • 好吧,但是我需要二进制文件,它不能作为纯 Java 解决方案使用
  • Jave
  • Java 还需要每个平台的特定二进制文件,jffmpeg(真正的 Java 端口?)可能是一种解决方案,但必须有更好的解决方案。
  • 这个 Stack Overflow 问题可能会有所帮助:stackoverflow.com/questions/10114413/…

标签: java image video ffmpeg sequence


【解决方案1】:

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

让我们看看。你必须:

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

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

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

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

【讨论】:

  • 是否有一些最适合的特定编解码器? mjpeg?不能使用任何 ffmpeg 包装器。
  • @Daniel Ruf:准确解码您的视频的那个?对于要处理的每个视频编码,您都需要一个视频编解码器。正如我在回答中所说,包装器项目产生了一些纯 Java 视频编解码器。那些纯 Java 视频编解码器就是你想要的。
  • 我想为第一个小版本选择最佳编码并考虑 Motion JPEG。但是好像不规范。
  • @Daniel Ruf:选择此处列出的格式:jffmpeg.sourceforge.net/formats.html
【解决方案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

【讨论】:

  • 好吧,他们在创建网站时失败了,www.jcodec.org 不起作用,但是 jcodec.org(没有 www),遗憾的是他们没有关于方法、类的真实文档...... =(
  • 我尝试了他们的示例,但我得到 NullPointerException 并且不知道为什么。有人可以帮忙吗? stackoverflow.com/questions/19344051/…
  • 如果您需要快速解决方案,我建议不要使用 jcodec。最后一个版本 0.1.10 需要 +- 700 毫秒来抓取一帧。它肯定不适合视频播放
【解决方案3】:
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视频所有的视频帧!
  • 这不依赖于 OpenCV 和其他一些二进制文件和库吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多