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

Python3.14 + MoviePy2.2.1使用CompositeVideoClip合并子剪辑时出现AttributeError错误求助

Python3.14 + MoviePy2.2.1使用CompositeVideoClip合并子剪辑时出现AttributeError错误求助

兄弟,这个问题我之前也踩过同款坑!一眼就看到核心原因了😅

错误根源:提前关闭了依赖的子剪辑

你在创建完CompositeVideoClip之后,立刻就把clip1、clip2、clip3这三个子剪辑close()掉了,但MoviePy的剪辑对象是懒加载机制——它不会立刻把子剪辑的内容复制到内存,只是保留了对这些子剪辑的引用。当你执行write_videofile的时候,程序才会真正去读取子剪辑的音频/视频数据,可这时候子剪辑已经被关闭,对应的音频读取进程已经被销毁成None了,自然就找不到stdout属性,报出那个长长的错误。

修正方案:调整资源释放顺序

把关闭子剪辑的代码移到整个视频输出完成、主剪辑也关闭之后,甚至你可以不用手动关闭子剪辑(MoviePy会在主剪辑释放时自动清理子资源)。

给你改好的代码:

import moviepy as mp

# 加载源视频
source_clip = mp.VideoFileClip('test4.mp4')
fps = source_clip.fps

# 切割子剪辑
c0 = 2
c1 = 4
clip1 = source_clip.subclipped(0, c0)
clip2 = source_clip.subclipped(c0, c1)
clip3 = source_clip.subclipped(c1, source_clip.end)

# 合并剪辑(这里只是建立引用,还没真正读取数据)
final_clip = mp.CompositeVideoClip([clip1, clip2, clip3])

# 输出视频(这一步才会真正读取子剪辑的资源)
final_clip.write_videofile('test_out.mp4', threads=8)

# 按顺序释放资源:先主剪辑,再子剪辑,最后源剪辑
final_clip.close()
clip1.close()
clip2.close()
clip3.close()
source_clip.close()

额外小技巧

如果只是做线性拼接视频(像你这样把视频切成几段再原样拼回去),用concatenate_videoclips比CompositeVideoClip更合适,它是专门为线性拼接设计的,效率更高,也更不容易踩资源引用的坑:

from moviepy.video.compositing.concatenate import concatenate_videoclips

# 替换CompositeVideoClip的拼接方式
final_clip = concatenate_videoclips([clip1, clip2, clip3])

备注:内容来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:57:59