Java / OpenCV - Как сделать запись видео h264 без потерь в openCV?

в последнее время у меня были проблемы с VideoWriter в openCV под java. Я хочу записать видеофайл в контейнер * .mp4 с кодеком h.264, но я не вижу возможности переключать битрейт или качество в openCV VideoWriter. Я создал openCV с ffmpeg в качестве бэкэнда. Я просто хочу записать видеофайл с точными значениями качества как исходное входное видео. У меня также есть код для работы

import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.videoio.VideoWriter;
import org.opencv.videoio.Videoio;

public class VideoOutput
{
     private final int H264_CODEC = 33;

     private VideoWriter writer;

     private String filename;

     public VideoOutput (String filename)
     {
        writer = null;

        this.filename = filename;
    }

    public void initialize(double framesPerSecond, int height, int width) throws Exception
    {

        this.writer = new VideoWriter();

        this.writer.open(filename, H264_CODEC, framesPerSecond, new Size(width, height));

        if (!writer.isOpened())
        {
             Logging.LOGGER.severe("Could not create video output file " + filename + "\n");

             throw new Exception("Could not create video output file " + filename + "\n");
        }
    }

    public void setFrame(VideoFrame videoFrame) throws Exception
    {
         if (writer.isOpened()) 
         {
             Mat frame = ImageUtil.imageToMat(videoFrame.getFrame());

             writer.write(frame);

             frame.release();
         }
    }

Я надеялся, что VideoWriter предоставит несколько вариантов для выполнения этой работы, но, похоже, это не так.

Итак, есть ли опция или флаг, который мне не хватает для записи видео без потерь h264 под openCV и java ИЛИ, может быть, есть другой способ сделать это? Пожалуйста, помогите мне - если вы уже сделали это, я действительно был бы признателен за некоторый пример кода, чтобы все было сделано.

ОБНОВИТЬ

Теперь у меня есть решение, подходящее для моего приложения, вот оно:

String fps = Double.toString(this.config.getInputConfig().getFramesPerSecond());

Runtime.getRuntime().exec(
        new String[] {
        "C:\\ffmpeg-3.4.2-win64-static\\bin\\ffmpeg.exe",
        "-framerate",
        fps,
        "-i",
        imageOutputPath + File.separator +  "%01d.jpg",
        "-c:v",
        "libx265",
        "-crf",
        "1",
        imageOutputPath + File.separator +  "ffmpeg.mp4"
        }
    );

Благодарности @Gyan, который дал мне правильный вызов ffmpeg в этом посте:

Win / ffmpeg - Как сгенерировать видео из изображений под ffmpeg?

Приветствует

Поверьте, это не возможно.

Gyan 14.08.2018 16:05

Итак, похоже, что openCV использует ffmpeg для h264, а ffmpeg использует openh264 от cisco для правильного выполнения работы? Поэтому было бы необходимо изучить источник ffmpeg, изменив его так, чтобы качество / битрейт было динамическим, а интерфейс openCV изменил для решения этих новых функций в ffmpeg, верно? Есть ли другой вариант, чтобы быстро поработать?

JohnDoeAnon 14.08.2018 16:24

В python и с пакетом scikit-video кажется возможным настроить режим без потерь: gist.github.com/docPhil99/a612c355cd31e69a0d3a6d2f87bfde8b

JohnDoeAnon 14.08.2018 16:36

Или вы можете просто использовать ffmpeg напрямую через оболочку.

Gyan 14.08.2018 16:38

Может быть, у вас есть Java-код, чтобы предоставить пример вызова ffmpeg в цикле с желаемыми параметрами с оболочкой?

JohnDoeAnon 14.08.2018 16:41

@Gyan или, может быть, просто вызов ffmpeg, где я помещаю изображение в вызов плюс параметр без потерь и выходной файл - извините, я не в этом материале ffmpeg

JohnDoeAnon 14.08.2018 16:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
1 084
0

Другие вопросы по теме