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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 07:43:21