MoviePy CompositeVideoClip合并可变TextClip列表拼接无效问题问询
MoviePy可变数量文本片段合并解决方案
核心修改方法
你不需要手动枚举txt_clips的每个索引元素,以下两种写法都可以实现可变长度文本剪辑的合并:
- 写法1:使用列表解包语法
把原来的CompositeVideoClip构造行替换为以下代码:final_video = CompositeVideoClip([video_with_new_audio, *txt_clips]) - 写法2:使用列表拼接
你之前尝试的[video_with_new_audio] + txt_clips逻辑本身是完全正确的,代码如下:composite_list = [video_with_new_audio] + txt_clips final_video = CompositeVideoClip(composite_list)
拼接不生效的常见排查点
如果上述写法没有生效,优先检查以下问题:
- 确认
txt_clips列表内所有元素都是合法的TextClip对象,没有混入非剪辑类型的值,可以在拼接前打印len(txt_clips)和每个元素的类型确认 - 检查TextClip依赖的ImageMagick是否正常配置:Windows系统需要单独安装ImageMagick,且需要在代码开头指定二进制文件路径:
from moviepy.config import change_settings # 路径替换为你本地的ImageMagick安装路径 change_settings({"IMAGEMAGICK_BINARY": r"C:\Program Files\ImageMagick-7.1.1-Q16\magick.exe"}) - 检查每个文本剪辑的
set_start时间+duration没有超过底层视频的总时长,超出时长的片段不会被渲染 - 确认文本剪辑的层级:列表中越靠后的剪辑层级越高,当前写法中文本剪辑在底层视频之后,不会被视频层盖住,无需调整层级顺序
完整修改后示例代码
from moviepy.editor import * # Windows用户请取消注释下面两行,配置自己的ImageMagick路径 # from moviepy.config import change_settings # change_settings({"IMAGEMAGICK_BINARY": r"C:\Program Files\ImageMagick-7.1.1-Q16\magick.exe"}) picture = VideoFileClip("img.jpg", audio=False).set_duration(50) # 这里的texts可替换为任意长度的用户输入内容 textOne = "First Line!" textTwo = "Second Caption!!!!" textThree = "Third one!!!" texts = [textOne, textTwo, textThree] step = 15 #每15秒出现一个文本:0, 15, 30 duration = 10 t = 0 txt_clips = [] # 不需要固定range长度,直接遍历texts即可适配任意数量的输入文本 for text in texts: txt_clip = TextClip(text,fontsize = 40, color='white') txt_clip = txt_clip.set_start(t) txt_clip = txt_clip.set_pos('center').set_duration(duration) txt_clips.append(txt_clip) t += step audio = AudioFileClip(r"C:\Users\Public\Music\Sample Music\Kalimba.mp3").subclip(0,50) video_with_new_audio = picture.set_audio(audio) # 适配可变数量文本的核心写法 final_video = CompositeVideoClip([video_with_new_audio, *txt_clips]) final_video.write_videofile("TEXT.mp4")
内容的提问来源于stack exchange,提问作者meshh
相关产品推荐
相关产品推荐

