You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于MoviePy为Python视频处理程序添加居中字幕?

为MoviePy视频处理程序添加居中字幕解决方案

问题背景

基于Python的MoviePy库开发视频处理程序,已实现以下功能:

  • 将TTS音频(output-tts.mp3)与背景音乐结合
  • 将游戏画面素材裁剪为9:16比例
  • 匹配音频与视频时长

此前尝试用ImageMagick添加字幕时出现多种问题:背景空白、文本无法修改、视频比例超出9:16、生成无效长视频,现需添加实现居中字幕的代码。

解决方案代码

以下是整合了居中字幕功能的完整代码,支持静态整段字幕或动态时间轴字幕两种方式:

from moviepy.editor import (
    AudioFileClip, CompositeAudioClip, VideoFileClip,
    TextClip, CompositeVideoClip, SubtitlesClip
)
import json

# 路径配置
background_video_path = "src/bgvid.mp4"
output_audio_path = "output/output-tts.mp3"
output_video_path = "output/output-with-subtitles.mp4"
# 若使用动态字幕,需准备SRT字幕文件路径
subtitle_srt_path = "subtitles.srt"

# 读取配置文件
with open("config.json", "r") as json_file:
    data = json.load(json_file)

# 加载并处理音频
song_clip = AudioFileClip(data["song"]).volumex(0.09)  # 背景音乐音量调整
tts_clip = AudioFileClip(output_audio_path)

# 匹配音频时长
min_duration = min(song_clip.duration, tts_clip.duration)
song_clip = song_clip.subclip(0, min_duration)
tts_clip = tts_clip.subclip(0, min_duration)
combined_audio = CompositeAudioClip([song_clip, tts_clip])

# 裁剪并处理背景视频(补全9:16裁剪逻辑)
def crop_video(video_path):
    video = VideoFileClip(video_path)
    target_aspect = 9 / 16
    current_aspect = video.w / video.h
    if current_aspect > target_aspect:
        # 宽屏裁剪高度
        new_width = int(video.h * target_aspect)
        x_center = video.w / 2
        video = video.crop(x1=x_center - new_width/2, x2=x_center + new_width/2)
    else:
        # 竖屏裁剪宽度
        new_height = int(video.w / target_aspect)
        y_center = video.h / 2
        video = video.crop(y1=y_center - new_height/2, y2=y_center + new_height/2)
    return video

cropped_video = crop_video(background_video_path)
cropped_video = cropped_video.subclip(0, min_duration).set_audio(combined_audio)

# --- 字幕添加部分 ---
# 方式1:静态字幕(整段视频显示同一文本)
# text_clip = TextClip(
#     "这里是你的静态字幕内容",
#     fontsize=50,
#     color="white",
#     font="SimHei",  # 指定中文字体避免乱码,可替换为系统支持的字体
#     stroke_color="black",  # 添加描边增强可读性
#     stroke_width=2
# )
# text_clip = text_clip.set_position("center").set_duration(min_duration)

# 方式2:动态时间轴字幕(加载SRT字幕文件)
def make_text_clip(txt):
    return TextClip(
        txt,
        fontsize=45,
        color="white",
        font="SimHei",
        stroke_color="black",
        stroke_width=2
    )
subtitles = SubtitlesClip(subtitle_srt_path, make_text_clip)

# 合成带字幕的最终视频
# 若用静态字幕,替换subtitles为text_clip
final_video = CompositeVideoClip([cropped_video, subtitles])

# 导出视频
final_video.write_videofile(
    output_video_path,
    codec='libx264',
    audio_codec='aac',
    fps=24,
    threads=4  # 多线程加速导出
)

关键说明

  • 字体设置:必须指定支持中文的字体(如SimHei),避免字幕乱码;若系统无该字体,可替换为字体文件路径(如font="path/to/your/font.ttf")
  • 字幕可读性:添加stroke_color和stroke_width为文本加描边,避免字幕与视频背景融合
  • 动态字幕SRT格式:SRT文件需符合标准格式,示例如下:
    1
    00:00:00,000 --> 00:00:03,000
    第一句字幕内容
    
    2
    00:00:03,000 --> 00:00:06,000
    第二句字幕内容
    
  • ImageMagick配置:确保已安装ImageMagick,Windows用户需在代码开头添加import os; os.environ["IMAGEMAGICK_BINARY"] = "path/to/convert.exe"指定工具路径

内容的提问来源于stack exchange,提问作者flip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:28:21