""" 给视频加入逐帧显示的字幕.py。 这个程序的原理是利用txt2images命令把文字转换成逐帧图像, 然后把这些帧都合成到视频当中。本程序需要gameturtle模块支持。 用cmd命令打开管理员窗口,输入pip install gameturtle即可安装。 """ import numpy as np from gameturtle import txt2images from moviepy.editor import VideoFileClip,ImageClip,CompositeVideoClip,concatenate_videoclips def make_text(s,w,h,size=38,fill='cyan'): """生成文本,s:文本,w:宽度,h:高度""" frames = txt2images(s,width=w,height=h,fontsize=size,fgcolor=fill) index = 0 for frame in frames: f = f"frames/{index}.png" frame.save(f) index += 1 return f # 注意返回最后一张图片的路径。 def composite_frame(video_path,frame_array,begin,end): """截取一段视频,把frame_array合成进去,frame_array是转换成numpy数组的图形对象。 """ video = VideoFileClip(video_path).subclip(t_start=begin,t_end=end) # 剪辑视频 logo = (ImageClip(frame_array).set_duration(video.duration) # 水印持续时间 .margin(right=8, top=108,opacity=1) # 水印边距和透明度 .set_pos(("left", "top"))) # 水印的位置 final = CompositeVideoClip([video, logo]) # 把logo合成进视频 return final txt = '钢铁侠是怎么练成的!' frames = txt2images(txt,width=720,height=1280,fontsize=38,fgcolor='cyan') frames2 = [np.array(frame) for frame in frames] video_list = [] video_path = 'dy.mp4' start_time = 0 # 开始时间 for i in range(len(txt)): frame_array = frames2[i] # 把转换成numpy数组的图形对象合成到视频中。 v = composite_frame(video_path,frame_array,start_time,start_time+0.5) print(v) video_list.append(v) start_time += 0.5 final = concatenate_videoclips(video_list) # 所有短视频连接起来 final.write_videofile("logo.mp4", codec="libx264", bitrate="10000000")
李兴球
李兴球的博客是Python创意编程原创博客
要发表评论,您必须先登录。
发表评论