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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:20:20