Как создать видео из файлов svg с помощью конвейера с ffmpeg?

Как создать видео из файлов svg с помощью конвейера с ffmpeg?

Я хочу создать видео из графики svg, хранящейся в базе данных. Моя процедура будет следующей для архивации этого:

  1. подключиться к базе данных
  2. создайте команду ffmpeg, которая принимает канал в качестве входных данных
  3. запустите дочерний процесс ffmpeg
  4. Дождитесь результата процесса.

начните другую тему: Для всех файлов svg выполните:

  1. загрузить svg из базы данных в байтовый буфер
  2. записать байтовый буфер в stdin дочернего процесса ffmpeg

При запуске моего кода я сталкиваюсь с проблемой при передаче файлов svg в ffmpeg.

Я использовал ffmpeg -f image2pipe -c:v svg -i - -c:v libx264 -y Downloads/out.mp4. Но затем ffmpeg выдает мне следующую ошибку:

[image2pipe @ 0x562ebd74c300] Could not find codec parameters for stream 0 (Video: svg (librsvg), none): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options

Я обнаружил, что svg_pipeв ffmpeg есть такой формат, поэтому попробовал его — безуспешно, та же ошибка.

Другой возможностью было бы загрузить все файлы svg во временный каталог, а затем использовать ffmpeg без конвейера, что сработало, когда я попробовал. Команда будет такой: ffmpeg -i *.svg -c:v libx264 out.mp4Но в моем случае я хотел бы избежать этого.

Почему команда без конвейера работает, а команда с конвейером (типа: cat sample.svg | ffmpeg -f svg_pipe -i - -c:v libx264 out.mp4) не работает? И как мне использовать конвейер в моем случае?

Мое текущее решение: Я использую -f rawvideoаргумент, чтобы передать графику в ffmpeg. Это рабочее решение, но оно предполагает, что мне нужно преобразовать графику svg в формат raw RGB. Я взял это решение отсюдаотвечатьна Stackoverflow.

решение1

Методом проб и ошибок мне удалось найти ряд аргументов, которые работают:

cat sample.svg | ffmpeg -f svg_pipe -frame_size 1000000000 -video_size 100x100 -i - -c:v libx264 -y out.mp4


Параметры svg_pipeдемультиплексора можно получить, выполнив следующую команду:
ffmpeg -h demuxer=svg_pipe

Выход:

Demuxer svg_pipe [последовательность svg, переданная по конвейеру]:
svg demuxer AVOptions:
-frame_size .D......... задать размер кадра в байтах (от 0 до INT_MAX) (по умолчанию 0)
-framerate <video_rate> .D......... установить частоту кадров видео (по умолчанию "25")
-pixel_format .D......... установить формат пикселей видео
-video_size <image_size> .D......... установить размер видео
-loop .D......... принудительно выполнить цикл по последовательности входного файла (по умолчанию false)

По какой-то причине нам приходится устанавливать -frame_sizeаргумент больше размера входного файла.


Обратите внимание, что кодек H.264 не поддерживает прозрачность, поэтому в большинстве случаев вывод будет выглядеть странно (цвет фона по умолчанию черный).
Рассмотрите возможность наложения SVG на белый фон.


Пример (используется FFmpeg версии n4.3.1 в Ubuntu 18.04):

Вход:
https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/atom.svg

Выход:
введите описание изображения здесь

Связанный контент