Я хочу, чтобы определенный текст, например Hello world
, был распределен по нескольким строкам и по всему видеопространству/странице, как здесь.
Я запускаю команды ffmpeg в скрипте python, используя bash в качестве подпроцесса. Образец кода:
subprocess.run( [ "ffmpeg", "-i", input_file, "-vf", f"drawtext=font = {font_family}:text = {watermark_text}:fontcolor = {font_color}:fontsize = {font_size}{background_box}:{watermark_position}", "-codec:a", "copy", "-preset", encoding_preset, f"./watermark/{media_id}.mp4", ] )
Есть ли хороший способ добиться этого?
@Gyan - Вопрос о прозрачном холсте, можете ли вы создать его только с фильтром color
src? Как вы, возможно, заметили в моем ответе на другой пост, мне пришлось создать его с помощью трех фильтров: color,format=rgba,colorkey
. Есть ли способ лучше?
color=black@0,format=yuva420p
Чтобы текст повторялся, нужно ли последовательно использовать несколько фильтров рисования текста?
ffmpeg -i video.mp4 -filter_complex "color=black:100x100,format=yuva444p[c];[c][0]scale2ref[ct][mv];[ct]setsar=1,drawtext=font ='Roboto':text='Test Text':fontsize=36:fontcolor=white,split[text][alpha];[text][alpha]alphamerge,rotate=(55*PI/180 ):ow=rotw(55*PI/180):oh=roth(55*PI/180):c=black@0[txta];[mv][txta]overlay=x ='min(0,-Hsin(55*PI/180))+100':y='min(0,Wsin(55*PI/180))+50':shortest=1,tile=8x8" output_video.mp4
Я использую указанную выше команду, но вместо создания плиток только для текста я создаю плитки для всего видео.
ffmpeg -i video.mp4 -filter_complex "color=black:100x100,format=yuva444p[c];[c][0]scale2ref[ct][mv];[ct]setsar=1,drawtext=font ='Roboto':text='Test Text':fontsize=36:fontcolor=white,split[text][alpha];[text][alpha]alphamerge,rotate=(55*PI/180 ):ow=rotw(55*PI/180):oh=roth(55*PI/180):c=black@0,tile=8x8[txta];[mv][txta ]overlay=x='min(0,-Hsin(55*PI/180))+100':y='мин(0,Wsin(55*PI/180))+50':shortest=1" output_video.mp4 --> Затем я использовал это, но текст появляется только один раз
@Gyan, не могли бы вы помочь мне с этим?
Завтра...........
Не могли бы вы посмотреть на это @Gyan
Позже сегодня....
Я удалил дополнительную конфигурацию, которая, как мне казалось, не нужна, но по-прежнему получаю тот же вывод (текст появляется только один раз). Обновленная команда: ffmpeg -i video.mp4 -filter_complex "drawtext=font='Roboto':text='Test Text':fontsize=20:fontcolor=white,split[text][alpha];[text][alpha]alphamerge,rotate=(55*PI/180):ow=rotw(55*PI /180):oh=roth(55*PI/180):c=black@0,tile=10x10[txta];[0][txta]overlay=x='min(0) ,-Hsin(55*PI/180))+100':y='мин(0,Wsin(55*PI/180))+50':shortest=1" output_video.mp4
Не могли бы вы взглянуть на это @Gyan
Это ваш основной шаблон. Я предполагаю, что вход 720p.
ffmpeg -i 720p_input -f lavfi -i "color=black@0:s=64x64,format=yuva420p" -filter_complex "[1]trim=end_frame=1,drawtext=font = {font_family}:text = {watermark_text}:fontcolor = {font_color}:fontsize = {font_size}{background_box}:{watermark_position},rotate=a = {degree}*PI/180:ow=hypot(iw,ih):oh=ow:c=black@0,loop=-1:1:0,tile=15x9,trim=end_frame=1[wm];[0][wm]overlay=0:0" -c:a copy -preset encoding_preset ./watermark/{media_id}.mp4
{degree}
следует заменить на угол поворота.
Максимальный размер каждой текстовой ячейки — 64 x sqrt(2) = 90 pixels
с каждой стороны.
15x9
— мозаичный макет. Отрегулируйте это, чтобы покрыть весь входной кадр.
Мне просто нужно было изменить фильтр «поворот» на это, и это сработало. Большое спасибо! rotate=(30*PI/180):ow=rotw(30*PI/180):oh=rot(30*PI/180)
Создайте небольшой прозрачный холст, используя фильтр
color
. Нарисуйте текст, поверните, используйте тайловый фильтр, наложите на видео.