#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 или вручную.