Как добавить несколько текстов(подписей) к видео с помощью Python-Moviepy?

#python #animation #caption #moviepy #closed-captions

Вопрос:

В некоторых случаях нам нужно добавить подписи к видео.В моем случае я работал с проблемой, связанной с описанием видео (субтитрами) Этот код на python помогает добавлять подписи к видео.Мне было интересно, если кому-то нужно решение, не стесняйтесь экспериментировать с кодом.

 import moviepy.editor as mp


my_video = mp.VideoFileClip("video.mp4") #video path
w,h = moviesize = my_video.size
my_text = mp.TextClip("A man and a women are sitting on a bench", font="Amiri-regular", color="white", fontsize=34)
txt_col = my_text.on_color(size=(my_video.w   my_text.w, my_text.h 5), color=(0,0,0), pos=(6,"center"), col_opacity=0.6)
txt_mov = txt_col.set_pos( lambda t: (max(w/30,int(w-0.5*w*t)),max(5*h/6,int(100*t))) )
final = mp.CompositeVideoClip([my_video,txt_mov])
final.subclip(0,17).write_videofile("final.mp4",fps=24,codec="libx264")
 

Это хорошо работает для одной подписи..Вы можете играть с параметрами для изменений

 """Multiple Text in single video"""

 
import moviepy.editor as mp


my_video = mp.VideoFileClip("/home/user/cap/video.mp4").subclip(0,10)
print(my_video.duration)
w,h = moviesize = my_video.size

texts = []
with open("/home/user/cap/caption.txt") as file:
    for line in file: 
        line = line.strip() #or some other preprocessing
        texts.append(line)

print(type(texts))

starts = [0,2,4,6,8,10,12,14,16,18,20] # or whatever
durations = [2,2,2,2,2] #Time duraton between captions
t = 0
txt_clips = []
for text,t,duration in zip(texts, starts, durations):
  txt_clip = mp.TextClip(text,font="Amiri-regular", color="black", fontsize=29)
  txt_clip = txt_clip.set_start(t)
  txt_col = txt_clip.on_color(size=(my_video.w   txt_clip.w, txt_clip.h 5), color=(0,0,0), pos=(6,"center"), col_opacity=0.6)
  txt_clip = txt_clip.set_pos( lambda t: (max(w/30,int(w-0.5*w*t)),max(5*h/6,int(100*t))) ).set_duration(duration)
  txt_clips.append(txt_clip) 
  print(txt_clips)
  print(type(txt_clips))

   
final_video = mp.CompositeVideoClip([my_video, txt_clips[0],txt_clips[1],txt_clips[2],txt_clips[3],txt_clips[4]])

final_video.write_videofile("TEXT.mp4",fps=24)