Я пытаюсь реализовать следующий цикл:

  1. Поместите logo.png в произвольную (x, y) позицию видео.
  2. Заставьте логотип исчезнуть через 2 секунды.
  3. Подождите 30 секунд и повторите.

После исследования в Google я адаптировал различные коды и получил это:

ffmpeg -i input.mp4 -loop 1 -i logo.png -filter_complex "[1]trim=0:30,fade=in:st=0:d=1:alpha=1,fade=out:st=9:d=1:alpha=1,loop=999:750:0,setpts=N/25/TB[w];[0][w]overlay=shortest=1:x=if(eq(mod(n\,200)\,0)\,sin(random(1))*w\,x):y=if(eq(mod(n\,200)\,0)\,sin(random(1))*h\,y)" output.mp4

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

Что я должен изменить, чтобы это работало? Кроме того, возможно ли уменьшить непрозрачность logo.png или использовать вместо этого текст?

3 ответа3

1

Другая формулировка, которая может работать лучше, взята из статьи Stack Overflow
ffmpeg - динамические буквы и случайные позиции водяного знака на видео? ,

ffmpeg -i input.mp4 \
-vf \
"drawtext=fontfile=font.ttf:fontsize=80:fontcolor=yellow@0.5:text='studentname': \
 x=if(eq(mod(t\,30)\,0)\,rand(0\,(W-tw))\,x): \
 y=if(eq(mod(t\,30)\,0)\,rand(0\,(H-th))\,y)" \
-c:v libx264 -crf 23 -c:a copy output.mp4

Это будет рандомизировать позицию каждые 30 секунд без повторов.

0

Мне удалось написать команду, которая работает, поэтому я буду публиковать здесь, если кому-то нужно.

ffmpeg.exe -i input.mp4 -vf drawtext="fontsize=10:fontfile=/Windows/Fonts/arial.ttf:text='Text Here':x=if(eq(mod(n\,1200)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(n\,1200)\,0)\,rand(0\,(h-text_h))\,y):enable=lt(mod(n\,1200)\,200)" -c:v libx264 -crf 17 -c:a copy output.mp4

Параметр t\ не работал, это была моя первая проблема с использованием примеров из документации ffmpeg и из ответов в стеке сообщества.

Мне потребовалось некоторое время, чтобы заметить эту проблему. Может быть, что-то в Windows. Поэтому я просто использовал n\ вместо числа кадров.

Так что теперь (х, у) меняются каждые 1200 кадров

х = если (экв (мод (п \, 1200)\, 0)\, Rand (0 \, (п-text_w))\, х): у = если (экв (мод (п \, 1200)\, 0)\, Rand (0 \, (ч-text_h))\, у)

Показать текст на 200 кадров каждые 1200 кадров

Enable = Lt (мод (п \, 1200)\, 200)

Спасибо за помощь здесь!

0

Я обнаружил, что ваш первый образец с использованием логотипа идеально подходит для моего использования, я внес небольшие изменения, чтобы логотип был случайным в полном видео, а не только в верхнем левом углу.

ffmpeg -i input.mp4 -loop 1 -i logo.png -filter_complex "[1]trim=0:30,fade=in:st=0:d=1:alpha=1,fade=out:st=9:d=1:alpha=1,loop=999:750:0,setpts=N/25/TB[w];[0][w]overlay=shortest=1:x=if(eq(mod(n\,200)\,0)\,sin(random(1))*W\,x):y=if(eq(mod(n\,200)\,0)\,sin(random(1))*H\,y)" output.mpg

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .