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

使用MoviePy制作竖版视频报错:TypeError: int与NoneType不支持+运算

竖版视频制作报错:TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

问题详情

执行text_overlay = mp.concatenate_videoclips(text_clips, method='compose')时触发类型错误,报错堆栈如下:

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
 File "c:\Users\Lukas\Dokumenty\python_scripts\Billionare livestyle\main.py", line 43, in <module>
    create_vertical_video("nature.jpg","music.mp3","Don't be pushed around by the fears in your mind. Be led by the dreams in your heart.")
  File "c:\Users\Lukas\Dokumenty\python_scripts\Billionare livestyle\main.py", line 33, in create_vertical_video
    text_overlay = mp.concatenate_videoclips(text_clips, method='compose')
  File "C:\Users\Lukas\Dokumenty\python_scripts\Billionare livestyle\env\youtube\lib\site-packages\moviepy\video\compositing\concatenate.py", line 71, in concatenate_videoclips
    tt = np.cumsum([0] + [c.duration for c in clips])
  File "<__array_function__ internals>", line 180, in cumsum
  File "C:\Users\Lukas\Dokumenty\python_scripts\Billionare livestyle\env\youtube\lib\site-packages\numpy\core\fromnumeric.py", line 2571, in cumsum
    return _wrapfunc(a, 'cumsum', axis=axis, dtype=dtype, out=out)
  File "C:\Users\Lukas\Dokumenty\python_scripts\Billionare livestyle\env\youtube\lib\site-packages\numpy\core\fromnumeric.py", line 54, in _wrapfunc
    return _wrapit(obj, method, *args, **kwds)
  File "C:\Users\Lukas\Dokumenty\python_scripts\Billionare livestyle\env\youtube\lib\site-packages\numpy\core\fromnumeric.py", line 43, in _wrapit
    result = getattr(asarray(obj), method)(*args, **kwds)

涉及的核心代码片段:

print("Start")
def create_vertical_video(image_file, music_file, quote):
  ###########

    # Create text clip for each line
    text_clips = []
    for line in lines:
        text_clip = mp.TextClip(line, fontsize=24, color='white', bg_color='black')
        text_clip = text_clip.set_pos('center').set_duration(image.duration)
        text_clips.append(text_clip)

    # Overlay text clips on image
    text_overlay = mp.concatenate_videoclips(text_clips, method='compose')
    final_clip = mp.CompositeVideoClip([image, text_overlay])

    # Add music to final clip
    final_clip = final_clip.set_audio(music)

    # Save video
    final_clip.write_videofile("vertical_video.mp4", fps=24)


create_vertical_video("nature.jpg","music.mp3","Don't be pushed around by the fears in your mind. Be led by the dreams in your heart.")

错误原因

报错根源是concatenate_videoclips在计算剪辑时长累加时,列表中混入了None值——即某个文本剪辑的duration属性未被正确设置为有效值,导致整数与None相加触发类型错误。此外代码中还存在lines变量未初始化的问题。

修复方案

1. 初始化文本行变量

将传入的quote字符串分割为多行文本,示例:

lines = quote.split('. ')  # 按句号+空格分割,可根据需求调整规则

2. 确保所有剪辑时长有效

  • 加载图片时必须显式设置时长(建议匹配音乐时长):
    # 补充图片与音乐加载代码
    image = mp.ImageClip(image_file)
    music = mp.AudioFileClip(music_file)
    image = image.set_duration(music.duration)  # 图片时长同步音乐
    
  • 文本剪辑的时长需基于有效值设置,避免image.duration为None:
    text_clip = text_clip.set_pos('center').set_duration(image.duration)
    

3. 修正文本叠加逻辑(按需选择)

  • 如果需要同时显示多行文本,用CompositeVideoClip替代concatenate_videoclips:
    text_overlay = mp.CompositeVideoClip(text_clips)
    
  • 如果需要按顺序播放每行文本,确保每个文本剪辑设置独立时长,例如:
    text_clip = text_clip.set_pos('center').set_duration(2)  # 每行显示2秒
    

完整修复代码

import moviepy.editor as mp

print("Start")
def create_vertical_video(image_file, music_file, quote):
    # 加载资源并设置时长
    image = mp.ImageClip(image_file)
    music = mp.AudioFileClip(music_file)
    image = image.set_duration(music.duration)
    # 转换为竖屏分辨率(1080x1920)
    image = image.resize(height=1920).crop(x_center=image.w/2, width=1080)

    # 分割文本为多行
    lines = quote.split('. ')
    text_clips = []
    # 计算垂直方向的文本布局
    line_height = 40
    start_y = (image.h - len(lines)*line_height) // 2
    for idx, line in enumerate(lines):
        text_clip = mp.TextClip(line, fontsize=24, color='white', bg_color='black')
        # 设置文本位置与时长
        text_clip = text_clip.set_pos(('center', start_y + idx*line_height)).set_duration(image.duration)
        text_clips.append(text_clip)

    # 叠加文本到图片
    text_overlay = mp.CompositeVideoClip(text_clips)
    final_clip = mp.CompositeVideoClip([image, text_overlay])

    # 添加音乐并保存
    final_clip = final_clip.set_audio(music)
    final_clip.write_videofile("vertical_video.mp4", fps=24)

create_vertical_video("nature.jpg","music.mp3","Don't be pushed around by the fears in your mind. Be led by the dreams in your heart.")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:41:06