+
74
-

回答

在Python中为视频添加不同文字字幕样式,可以使用MoviePyOpenCV库。以下是两种方法的详细步骤和示例代码:

方法一:使用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支持)。

通过上述方法,你可以灵活地为视频添加多样化的字幕样式。

网友回复

我知道答案,我要回答