使用MoviePy concatenate_videoclips报错:NoneType无get_frame属性
问题分析与解决
错误根源
你在循环中创建VideoFileClip后立刻调用了clip2.close(),导致添加到export_list里的视频对象已经关闭了内部的读取器(reader变为None)。当concatenate_videoclips尝试读取视频帧进行拼接时,就会触发AttributeError。
修复方案
必须等到视频拼接、导出全部完成后,再关闭所有VideoFileClip对象。推荐用**上下文管理器(with语句)**自动管理资源,避免手动控制关闭时机出错:
from moviepy.editor import VideoFileClip, concatenate_videoclips from glob import glob def merge_and_write_videos(clip_list, export_file): # 用with语句自动管理每个视频的资源生命周期 with VideoFileClip(clip_list[0]) as first_clip: export_list = [first_clip] for clip_path in clip_list[1:]: with VideoFileClip(clip_path) as clip: export_list.append(clip) final = concatenate_videoclips(export_list) final.write_videofile(export_file, verbose=False, logger=None) final.close() # 调用示例 merge_and_write_videos(glob("*/**/*.mp4"), "full_video.mp4")
如果不想用嵌套with,也可以先收集未关闭的视频对象,完成导出后统一关闭,同时用try...finally保证出错时资源也能释放:
def merge_and_write_videos(clip_list, export_file): export_list = [] final = None try: for clip_path in clip_list: clip = VideoFileClip(clip_path) export_list.append(clip) final = concatenate_videoclips(export_list) final.write_videofile(export_file, verbose=False, logger=None) finally: # 确保所有资源被释放 for clip in export_list: clip.close() if final: final.close()
关键注意点
VideoFileClip.close()会释放底层文件句柄和读取器,一旦关闭就无法再读取帧。- 拼接和导出过程中,所有源视频必须保持未关闭状态,直到导出完成。
try...finally能避免导出中途出错时,视频文件被长期占用。
内容的提问来源于stack exchange,提问作者Godan
相关产品推荐
相关产品推荐

