
Я хочу создать видео из графики svg, хранящейся в базе данных. Моя процедура будет следующей для архивации этого:
- подключиться к базе данных
- создайте команду ffmpeg, которая принимает канал в качестве входных данных
- запустите дочерний процесс ffmpeg
- Дождитесь результата процесса.
начните другую тему: Для всех файлов svg выполните:
- загрузить svg из базы данных в байтовый буфер
- записать байтовый буфер в 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