Moviepy报错AttributeError:int对象无duration属性问题咨询
问题分析与解决:MoviePy concatenate_videoclips 触发 AttributeError
问题场景
尝试将文本剪辑与图片剪辑合并成一维数组,传入concatenate_videoclips时触发错误,核心代码片段:
list_of_images = [ text_clip, *image_data, ] final_video = concatenate_videoclips(list_of_images, method='compose')
报错信息:
Traceback (most recent call last): File "C:\Users\User\Development\moviepy\main.py", line 62, in <module> final_video = concatenate_videoclips(list_of_images, method='compose') File "C:\Users\User\AppData\Roaming\Python\Python313\site-packages\moviepy\video\compositing\concatenate.py", line 71, in concatenate_videoclips tt = np.cumsum([0] + [c.duration for c in clips]) ^^^^^^^^^^ AttributeError: 'int' object has no attribute 'duration'
错误原因
image_data被定义为字典,当用*image_data展开时,Python会默认展开字典的键(整数类型),而非存储的ImageClip对象。这导致list_of_images中混入了整数,而concatenate_videoclips遍历列表时,试图对整数调用.duration属性,触发AttributeError。
解决方法
提供两种可行修复方案:
方案1:将image_data改为列表(推荐)
不需要用字典存储剪辑对象,直接用列表追加更简洁:
# 初始化改为列表 image_data = [] directory_path = Path(r"C:/Users/User/Development/moviepy/images") for file_path in directory_path.iterdir(): if file_path.is_file() and is_image_by_extension(file_path): clip = ImageClip(str(file_path)).set_duration(2) clip = clip.fx(vfx.fadeout, 1).fx(vfx.fadein, 1) image_data.append(clip) else: print(f"'{file_path}' is not an image file (or doesn't exist).") # 合并列表时直接展开列表 list_of_images = [ text_clip, *image_data, ]
方案2:保留字典,展开字典的值
如果需要保留字典结构,展开时取字典的.values():
list_of_images = [ text_clip, *image_data.values(), ]
两种方案都能确保list_of_images中只包含TextClip和ImageClip对象,符合concatenate_videoclips的参数要求。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

