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

