Записать имена файлов отдельных изображений в выходной видеоролик FFmpeg

2703
Jpsy

Я использую FFmpeg для чтения серии отдельных изображений и вывода их в виде видео.
Результатом является интервальная съемка скриншотов сайта с интервалом в 1 минуту.

Теперь я хотел бы записать исходное время захвата каждого изображения в результирующее видео с помощью команды drawtext. Время захвата доступно в имени файла каждого изображения. Но мне не удалось найти какой-либо вариант для drawtext для доступа к именам файлов входных изображений.

Альтернативой было бы получить доступ к дате создания каждого изображения из DrawText (я также не могу найти способ сделать это). Но я бы определенно предпочел получить доступ к имени файла, так как это дало бы мне больше возможностей для форматирования текста.

Есть ли способ сделать это?
Было бы здорово, если бы любое предложенное решение работало и на Windows.

6

2 ответа на вопрос

2
Znuff

You won't be able to do it in one line, as ffmpeg's drawtext filter is not that advanced.

You will need to pre-process the images in advance with some scripting.

Something like a simple bash script:

for i in *.png; do time = $(echo $i | cut -d . -f 1) ffmpeg -i $i -vf "drawtext=text=$time" mod-$time.png done 

Then you can use the mod*.png files to create your video.

2
Jpsy

Ответ Znuff великолепен (принят и одобрен) и проложил путь к моему собственному решению. Поскольку это специфично для Unix, и мне пришлось работать над Win, вот мое решение для Windows 7 и выше:

Я использовал два пакетных файла (Master.cmd и Slave.cmd), чтобы просмотреть все изображения и записать в них имена файлов.

Master.cmd:

forfiles /p "MyImagesSubPath" /m "2014-02-15*.png" /c "cmd /c ..\Slave.cmd @file @fname 

Slave.cmd:

ffmpeg -i "%~1" -vf "crop=1072:1192:24:101, drawtext=text=%~2: fontcolor=white: fontsize=60: box=1: boxcolor=black@0.6: x=50:y=50: fontfile=c\\:\\\\Windows\\\\Fonts\\\\myfont.ttf" "mod_%~1" 

Объяснение:

Необходимо использовать два пакета по нескольким причинам:
1. Параметр / c forfiles принимает только командную строку ограниченной длины (253 символа).
2. Для вложения команды FFmpeg в параметр forfiles / c потребуется безумный уровень символов. excaping.

Фильтр имени файла «2014 -.... png» в Master.cmd используется для предотвращения повторной обработки цикла собственным выводом (с именем «mod _.... png») в бесконечном цикле. Вы должны адаптировать эту строку фильтра в соответствии с исходными изображениями.

Подчиненный пакет выполняется из подкаталога «MyImagesSubPath», расположенного под каталогом пакетов (именно здесь вы должны разместить исходные изображения). Slave.cmd получает имя файла с расширением (.png) и без него в качестве двух параметров.

Параметр имени файла без расширения используется как текст, который будет записан в изображение. Полученные изображения сохраняются с префиксом «mod_» в том же пути, что и исходные изображения. Имена файлов могут содержать пробелы.

Похожие вопросы