在Python中为视频添加不同文字字幕样式,可以使用MoviePy或OpenCV库。以下是两种方法的详细步骤和示例代码:
方法一:使用MoviePy(推荐)MoviePy提供了简洁的API来创建和添加带有样式的字幕,适合快速实现。
步骤:安装MoviePy:
pip install moviepy
示例代码:
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip # 加载视频 video = VideoFileClip("input.mp4") # 创建第一个字幕(红色,顶部居中,大字体) txt_clip1 = TextClip("Hello World", fontsize=70, color='red', font='Arial') txt_clip1 = txt_clip1.set_position(('center', 'top')).set_duration(5).set_start(0) # 创建第二个字幕(绿色,底部左侧,带背景) txt_clip2 = TextClip("Python字幕", fontsize=50, color='green', bg_color='white', font='SimHei') txt_clip2 = txt_clip2.set_position(('left', 'bottom')).set_duration(5).set_start(5) # 合成视频和字幕 result = CompositeVideoClip([video, txt_clip1, txt_clip2]) # 输出视频 result.write_videofile("output.mp4", codec='libx264', fps=24)参数说明:font: 字体名称(需系统已安装)。fontsize: 字体大小。color: 文字颜色(名称或十六进制值,如#FF0000)。bg_color: 背景颜色。position: 位置(('center', 'top')或像素坐标)。set_duration(): 字幕持续时间(秒)。set_start(): 开始时间(秒)。高级样式:阴影效果:叠加两个TextClip(黑色底+白色字)。
shadow = TextClip("Shadow", fontsize=70, color='black', font='Arial') text = TextClip("Shadow", fontsize=70, color='white', font='Arial') combined = CompositeVideoClip([shadow.set_position(('center+2', 'top+2')), text.set_position(('center', 'top'))])动画效果:使用set_position动态调整位置。
txt_clip = txt_clip.set_position(lambda t: ('center', 50 + 10*t))方法二:使用OpenCV + PIL(精细控制)
OpenCV结合PIL可逐帧处理视频,适合自定义复杂样式。
步骤:安装依赖库:
pip install opencv-python pillow
示例代码:
import cv2 from PIL import Image, ImageDraw, ImageFont import numpy as np # 加载视频 cap = cv2.VideoCapture('input.mp4') fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height)) # 字体设置 font_path = 'arial.ttf' # 需指定字体文件路径 font_size = 40 font = ImageFont.truetype(font_path, font_size) frame_count = 0 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 将帧转换为PIL图像 pil_img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(pil_img) # 在特定时间段添加不同字幕 if 1 <= frame_count/fps <= 5: # 蓝色字幕,带描边 text = "Hello OpenCV" x, y = 50, 50 # 描边(绘制多次偏移文字) for dx in [-2, 2]: for dy in [-2, 2]: draw.text((x+dx, y+dy), text, font=font, fill='black') draw.text((x, y), text, font=font, fill='blue') elif 6 <= frame_count/fps <= 10: # 黄色字幕,斜体 text = "Python字幕" draw.text((100, 200), text, font=font, fill='yellow') # 转换回OpenCV格式并写入视频 frame = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) out.write(frame) frame_count += 1 cap.release() out.release()参数说明:font_path: TrueType字体文件路径(支持中文)。fill: 文字颜色。使用PIL的ImageDraw绘制复杂样式(如描边、阴影)。注意事项:字体兼容性:确保字体文件存在且支持目标语言(如中文)。时间控制:精确计算帧数和时间(frame_count/fps)。性能优化:处理长视频时,MoviePy可能较慢,可尝试降低分辨率或分段处理。输出格式:使用libx264编码以获得更小文件(MoviePy需FFmpeg支持)。
通过上述方法,你可以灵活地为视频添加多样化的字幕样式。
网友回复