首页 > 解决方案 > OpenCV:可以用 Java 打开压缩视频吗?

问题描述

我压缩了 .avi 格式的视频。我想使用 OpenCV 从视频中获取帧。

public static void main(String[] args) {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    String filePath = "C:\\Users\\P6090053.avi";
    String output = "C:\\Users\\Test";

    if (!Paths.get(filePath).toFile().exists()) {
       System.out.println("File " + filePath + " does not exist!");
       return;
    }
   VideoCapture video = new VideoCapture(filePath);

   video.open(filePath);/*Cant open compressed video*/

   System.out.println(video.isOpened()); /*Always returns **false***/
}

而使用上面的代码我可以打开未压缩的视频,但我无法打开格式“Microsoft RLE”的压缩视频。

视频信息:文件扩展名:“avi”,格式:“RLE”,编解码器ID:“0*01000000”

示例视频:http ://www.engr.colostate.edu/me/facil/dynamics/avis.htm(下载bird.avi -格式 - Indeo4

提前致谢:)

标签: javafileopencvfile-processing

解决方案


FFmpegFrameGrabber在包装中使用org.bytedeco.javacv

例如:

FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(file);

grabber.start();
grabber.setFrameNumber(1000);

Java2DFrameConverter paintConverter = new Java2DFrameConverter();

ImageIO.write(paintConverter.getBufferedImage(grabber.grabKeyFrame(), 1), "jpg", new FileOutputStream("somewhere"));

您需要几个依赖项,OpenCV 本身、FFmpeg 和 FFmpeg 的本机库(或所有本机库)。下面的 Maven 示例包括 Windows 本机库。

<dependency>
  <groupId>org.bytedeco</groupId>
  <artifactId>javacv</artifactId>
  <version>1.4.1</version>
</dependency>
<dependency>
  <groupId>org.bytedeco.javacpp-presets</groupId>
  <artifactId>ffmpeg</artifactId>
  <version>3.4.2-1.4.1</version>
</dependency>
<dependency>
  <groupId>org.bytedeco.javacpp-presets</groupId>
  <artifactId>ffmpeg</artifactId>
  <version>3.4.2-1.4.1</version>
  <classifier>windows-x86_64</classifier>
</dependency>

推荐阅读