Как применить тайм-код, а затем ускорить видео в 4 раза с помощью ffmpeg без потери качества?

Я пытаюсь создать файл .bat для ffmpeg, который:

  • Применяет наложение временного кода (например, 00:17:23:02)
  • Ускоряет видео в 4 раза (но ПОСЛЕ применения тайм-кода)
  • Не "задевает" качество исходного видео

Вот что я получил:

for %%a in ("*.avi") do ( ffmpeg.exe -i "%%a" -vf "drawtext=fontfile=C\\:/Windows/Fonts/arial.ttf:timecode='00\:00\:00\:00':rate=5:text='Real \time\:':fontsize=46:fontcolor=white:x=30:y=30: box=1: boxcolor=0x00000000@1" -f avi "%%~na_with-time.avi" )


Это работает, но я не могу ускорить видео в 4 раза, а также сильно теряет качество (очень пикселизированное при перемещении по видео)

Вот какой код я мог бы использовать для ускорения видео в 4 раза, но я не могу получить его в приведенном выше коде (для работы):"setpts=0.25*PTS"

Также это качество:

Как видео выглядит до:

После преобразования с помощью приведенного выше кода ffmpeg .bat:

Есть ли способ ускорить видео в 4 раза (но с нормальным временным кодом) и при этом не менять качество экспортируемого видео)?

Также есть ли способ сделать черный ящик за тайм-кодом немного больше (5 пикселей во всех направлениях: влево, вверх, вправо, вниз)? Или, может быть, эффект обводки текста вместо черного ящика?

Ответы (1)

Использовать

for %%a in ("*.avi") do (
    ffmpeg.exe -i "%%a" -vf "drawtext=fontfile=C\\:/Windows/Fonts/arial.ttf:timecode='00\:00\:00\:00':rate=5:text='Real \time\:':fontsize=46:fontcolor=white:x=30:y=30:box=1:boxcolor=0x00000000@1:boxborderw=5,setpts=0.25*PTS" -c:v libx264 -f avi "%%~na_with-time.avi"
)

Добавлено boxborderw=5для ширины границы.

Добавлены настройки после drawtext.

Явно добавлен кодировщик -c:v libx264- его настройки по умолчанию должны давать хорошие изображения. Вы также можете придерживаться кодировщика по умолчанию (mpeg4) и просто добавить -q:v 5для приличного качества — 200 кбит/с по умолчанию — это слишком мало.


Для пользовательской строки тайм-кода удалитеtimecode='00\:00\:00\:00':rate=5

и изменить textна

text='Real \time\: %{eif\:trunc(t/3600)\:d\:2}h %{eif\:trunc(mod(t/60\,60))\:d\:2}m %{eif\:trunc(mod(t\,60))\:d\:2}s'

Спасибо! Есть ли способ заменить Real time:00:06:31:04 на Real time: 00h 06m 31s (чтобы был пробел после time:, не более : и кадры (последние цифры) удаляются)?
Кроме того, можно центрировать тайм-код (по горизонтали), не проверяя ширину видео (поэтому я не использую 1920/2 = 960). Может быть, что-то вроде 50% (аналогично HTML/CSS 50%)?
Для горизонтального центрирования добавьте x='(W-tw)/2'. Пользовательскую строку можно сделать, но это немного сложно, поэтому я добавлю ее завтра.
Спасибо! Я протестировал код и обнаружил проблему с размером текста тайм-кода: если видео очень большое (2K/4K), тайм-код очень маленький. Есть ли способ сделать тайм-код 20% от ширины видео?
Не напрямую. Добавьте fontsize=H/10где H высота видео. Протестируйте и посмотрите, какое выражение приводит к требуемому посадочному месту.
Спасибо! Есть ли способ решить эту проблему: иногда отрендеренное/конвертированное видео длиннее фактического времени (поэтому на этом снимке экрана указано, что оно длится 51 минуту, но на самом деле это 7:59 минут, оно не может превышать 7:59). минут в этом плеере): i.imgur.com/MozuyV4.png
Это похоже на поврежденный AVI. Может ли C4D сохранять в другом формате?
Я не записываю/сохраняю из Cinema 4D. Я записываю с помощью Bandicam.