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", идентификатор кодека: "0*01000000"

Пример видео: http://www.engr.colostate.edu/me/facil/dynamics/avis.htm (скачать bird.avi - Формат - Indeo4)

Заранее спасибо:)


person Praveen Gopal    schedule 22.05.2019    source источник
comment
Информация: может кому-то помочь: я использовал Xuggler для обработки видео в кадры: github.com/artclarke/xuggle-xuggler/blob/master/src/com/xuggle/   -  person Praveen Gopal    schedule 29.05.2019


Ответы (1)


Используйте 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>
person john16384    schedule 22.05.2019
comment
Я понял, что вы используете opencv, игнорируйте этот ответ, если нет возможности использовать javacv (который использует opencv) - person john16384; 22.05.2019
comment
Сейчас я попробовал FFmpeg, но получаю ошибку java.lang.NoClassDefFoundError: Не удалось инициализировать класс org.bytedeco.ffmpeg.global.avutil. Я гуглю, но не помогает. Я скачал полную банку bytedeco и добавил в проект. Но я не делаю то, чего мне действительно не хватает :( - person Praveen Gopal; 23.05.2019
comment
Обновленный ответ с необходимыми зависимостями Maven. Похоже, вам не хватает банки ffmpeg. - person john16384; 23.05.2019
comment
К сожалению, я не использую Maven :( Я пытаюсь загрузить зависимости из репозитория Maven, но все та же ошибка - person Praveen Gopal; 23.05.2019
comment
JavaCV имеет дюжину зависимостей. Я бы рекомендовал использовать систему управления зависимостями, если вы собираетесь ее использовать. - person john16384; 23.05.2019
comment
У меня есть вопрос: javacv обрабатывает сжатое видео? john - person Praveen Gopal; 23.05.2019
comment
Конечно, я обработал более 5000 видео, чтобы получить образцы кадров. - person john16384; 23.05.2019