Наложение текста на видео под нужным углом с помощью FFMPEG

#c #ffmpeg

#ffmpeg

Вопрос:

Я пытаюсь наложить некоторый текст на видео с помощью ffmpeg. Я могу наложить текст с помощью следующей команды.

 ffmpeg -i input1.mp4 -filter_complex "[0:v]transpose=2[anticlockwiserotated];[anticlockwiserotated]drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf: text='Test Text':x=100: y=50: fontsize=36: fontcolor=white:[textapplied];[textapplied]transpose=1" output_video.mp4
  

Это позволяет мне накладывать только горизонтально или вертикально.

Но я хочу добавить его под некоторым углом, например 45 градусов.

Для этого, если я изменю команду как

 ffmpeg -i input1.mp4 -filter_complex "[0:v]rotate=45*PI/180[anticlockwiserotated];[anticlockwiserotated]drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf: text='Test Text':x=100: y=50: fontsize=36: fontcolor=white:[textapplied];[textapplied]rotate=315*PI/180" output_video.mp4
  

При этом я получаю наложенное видео в виде:

введите описание изображения здесь

Потому что в этом первом я поворачиваю видео на 45 градусов, добавляю текст и возвращаю его в исходное положение. Итак, я теряю границы.

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

Заранее спасибо.

Ответ №1:

Основной метод заключается в создании текста на чистом холсте, затем альфа-слоя для текста, вращении результата и наложении его на основное видео.

В приведенной ниже команде a следует заменить на угол. Вместо этого в наложении используются координаты для drawtext. В зависимости от длины вашего текста, некоторые из них могут быть обрезаны, если вы повернули его против часовой стрелки. Поэтому проверьте и отрегулируйте смещение Y соответствующим образом.

 ffmpeg -i input1.mp4 -filter_complex 
        "color=black:100x100[c];
         [c][0]scale2ref[ct][mv];
         [ct]setsar=1,drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf:
             text='Test Text':fontsize=36:fontcolor=white,split[text][alpha];
         [text][alpha]alphamerge,rotate=a:ow=rotw(a):oh=roth(a):c=black@0[txta];
         [mv][txta]overlay=x='min(0,-H*sin(a)) 100':y='min(0,W*sin(a)) 50':shortest=1"
      output_video.mp4
  

Комментарии:

1. Это действительно полезно и еще одно небольшое сомнение, можем ли мы добавить к тексту эффекты жирного или курсивного шрифта … и возможно ли добавить текст в определенный период времени. Я имею в виду только с 10-й по 20-ю секунду видео, а оставшееся видео должно быть без текста.

2. Для выборочного выбора времени добавьте enable='between(t,10,20)' в drawtext. Вы можете использовать полужирный или курсивный TTF для этого стиля.

3. Привет для поворота, кажется, что я что-то делаю неправильно. Пожалуйста, проверьте эту команду один раз «ffmpeg -i input1.mp4 -filter_complex «color=black:100×100[c];[c][0]scale2ref[ct][mv];[ct]setsar=1,drawtext=fontfile=../../public/fonts/Roboto-Regular-webfont.ttf:text=’ Тестовый текст’:fontsize=36:fontcolor=white, разделить[текст][альфа];[текст][альфа] alphamerge, повернуть =55: ow = rotw(55): oh = roth(55): c = black @ 0[txta]; [mv] [txta] наложение = x=’min(0,-H sin(55)) 100′: y=’min(0, W sin(55)) 50′: самый короткий=1″ output_video.mp4″. При этом я почти получаю 90 градусов, но намереваюсь получить 55 градусов. Пожалуйста, укажите мне, где я делаю неправильно.

4. Угол должен быть в радианах, поэтому 55 градусов = a = 55*PI/180

5. @gone вы бы просто добавили еще один фильтр drawtext сразу после первого, разделенный запятой.

Ответ №2:

Одним из способов является использование субтитров ASS или SRT с фильтрами FFmpeg subtitles или ass.

введите описание изображения здесь

 ffmpeg -i input -filter_complex "subtitles=diagonal.ass" output
  

Субтитры SRT намного проще, чем ASS, и не поддерживают поворот, но вы можете вручную добавить его с помощью фильтра:

 ffmpeg -i input -filter_complex "subtitles=diagonal.srt:force_style='Angle=45'" output
  

Вы можете создать и оформить субтитры с помощью Aegisub или вручную.