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

MoviePy如何实现多个TextClip按顺序逐行切换显示

问题原因
  • 仅给文本剪辑设置了显示时长,未配置起始显示时间:MoviePy中所有剪辑默认起始时间为视频0秒,不加start配置的话所有文本会从视频开头就全部渲染,出现堆叠
  • 手动指定texts[0]、texts[1]的硬编码写法无法适配动态行数的字幕脚本,行数变化时会出现漏内容、脚本报错的问题
  • 时长计算逻辑存在未定义变量text,且未做时间偏移计算,字幕无法按语音顺序接续显示
实现方案

核心思路:逐行读取字幕时维护累计时间偏移量,每句字幕的起始时间等于之前所有字幕的时长之和,单句时长按字符数占总脚本字符数的比例分配总音频时长,所有文本剪辑生成完成后一次性传入合成接口,无需手动指定文本索引。

首先提前导入依赖:

from moviepy.editor import VideoFileClip, AudioFileClip, CompositeAudioClip, CompositeVideoClip, TextClip

完整可运行代码:

# 加载音视频基础素材
videoclip = VideoFileClip("Satisfying Minecraft Parkour.mp4")
audioclip = AudioFileClip("audio.mp3")
videoclip.audio = CompositeAudioClip([audioclip])
total_audio_length = audioclip.duration

# 读取字幕脚本,自动过滤空行
subtitle_list = []
with open('text.txt', 'r', encoding='utf-8') as f:
    for raw_line in f:
        clean_line = raw_line.strip()
        if clean_line:
            subtitle_list.append(clean_line)

# 计算全文字符总数,按比例分配单句字幕的显示时长
total_text_chars = sum(len(line) for line in subtitle_list)
per_char_play_time = total_audio_length / total_text_chars

text_clips = []
current_start = 0.0
for line in subtitle_list:
    line_play_time = len(line) * per_char_play_time
    # 生成单句字幕,配置位置、起始时间、显示时长
    single_text = TextClip(line, fontsize=55, color='white', font='Arial')\
        .set_pos('center')\
        .set_start(current_start)\
        .set_duration(line_play_time)
    text_clips.append(single_text)
    # 更新下一句字幕的起始时间
    current_start += line_play_time

# 一次性合成所有视频层,无需硬编码单个字幕索引
final_video = CompositeVideoClip([videoclip, *text_clips])
# 导出成品视频
final_video.write_videofile("sync_subtitle_output.mp4", fps=24)

补充说明

  • 该方案无需提前预知字幕脚本行数,任意行数的合法字幕都可以自动按顺序加载,单句字幕到期后自动消失,下一句接续显示,不会出现堆叠问题
  • 按字符数分配时长为近似同步方案,如果需要毫秒级精准对齐,可以将代码中current_start和line_play_time替换为语音对齐工具生成的精确时间戳,整体合成逻辑无需修改
  • 如果运行TextClip相关报错,检查系统中是否存在代码中指定的字体,替换为本地已安装的字体名称即可

内容的提问来源于stack exchange,提问作者Rebel In The F.D.G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:27:24