使用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
相关产品推荐
相关产品推荐

