java - OpenCV:可以用 Java 打开压缩视频吗?

标签 java file opencv file-processing

我压缩了.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)

提前致谢:)

最佳答案

使用org.bytedeco.javacv包中的FFmpegFrameGrabber

例如:

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 的 native 库(或所有 native 库)。下面的 Maven 示例包含 Windows native 库。

<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>

关于java - OpenCV:可以用 Java 打开压缩视频吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56258738/

相关文章:

java - Android - fragment 中的 java.lang.NullPointerException

java - 如何让 ImageIO.write 根据需要创建文件夹路径

python - 图像颜色检测

java - 在 nginx 代理后面运行的 tomcat webapp 中的远程 IP

java - 将 List<Object []> 拆分为 List<String> 的最有效方法

java - 修改 HttpServletRequest 体

c++ - 将 char[] 转换为 off_t

c - 将文本从文件打印到屏幕

python - 使用 OpenCV 和 SIFT/SURF 校正扫描图像以匹配原始图像

python - IP摄像机Python错误