Мне нужно нарисовать линию от точки к точке в ffmpeg. Я не вижу фильтра drawline в ffmpeg, поэтому я предполагаю, что необходимо использовать drawbox (см. Команду ниже). Как я могу приспособить это, чтобы нарисовать диагональную линию, скажем, от 10,10 до 500,500?

Я использовал теорему Пифагора, чтобы вычислить, насколько «широкой» должна быть линия, но это насколько я понял:

ffmpeg -i input.mp4 -vf drawbox=x=10:y=10:w=692:h=1:color=red output.mp4

Спасибо

1 ответ1

3

В этом конкретном случае, поскольку линия составляет 45%, мы можем использовать метод, приведенный ниже.

ffmpeg -i in.mp4 -filter_complex 
      "color=red:s=490x490,geq=lum='p(X,Y))':a='if(eq(X,Y),255,0)'[c];
       [0][c]overlay=10:10:shortest=1"
out.mp4

Фильтры GEQ позволяют манипулировать отдельными пикселями, используя выражения. Если линия находится под углом 45 градусов, это означает, что все точки находятся на прямой X = Y или X = -Y . Последний случай здесь не имеет значения.

Итак, сначала создается пустой холст. Его размер - это охват, необходимый для рисования всей линии (W = 500-10; H = 500-10). Затем GEQ устанавливает все пиксели с X = Y непрозрачными, а все остальные - прозрачными. (Выражение lum необходимо из-за причуды дизайна фильтра; все, что он делает, это сохраняет существующее значение трех плоскостей - luma & two chroma).

Затем на этот выход накладывается смещение (10,10). Самый короткий нужен, потому что ввод color/geq никогда не заканчивается.


Для общего случая линии произвольной степени вы должны нарисовать прямую линию, т.е. оставить альфа 255 для одной строки, то есть 'if(eq(Y,100),255,0)' , а затем использовать фильтр поворота для получить правильный угол. ( Заполнение поворота должно быть fillcolor=anycolor@0). Затем наложите это.

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