в последнее время у меня были проблемы с 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?
Приветствует
Итак, похоже, что openCV использует ffmpeg для h264, а ffmpeg использует openh264 от cisco для правильного выполнения работы? Поэтому было бы необходимо изучить источник ffmpeg, изменив его так, чтобы качество / битрейт было динамическим, а интерфейс openCV изменил для решения этих новых функций в ffmpeg, верно? Есть ли другой вариант, чтобы быстро поработать?
В python и с пакетом scikit-video кажется возможным настроить режим без потерь: gist.github.com/docPhil99/a612c355cd31e69a0d3a6d2f87bfde8b
Или вы можете просто использовать ffmpeg напрямую через оболочку.
Может быть, у вас есть Java-код, чтобы предоставить пример вызова ffmpeg в цикле с желаемыми параметрами с оболочкой?
@Gyan или, может быть, просто вызов ffmpeg, где я помещаю изображение в вызов плюс параметр без потерь и выходной файл - извините, я не в этом материале ffmpeg




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