在使用moviepy进行视频处理时,调用write_videofile方法保存视频文件时出现如下错误:
Traceback(most recent call last):File"Video\VideoShuffleConcatenate\script.py",line361,inrun File"<decorator-gen-55>",line2,inwrite_videofile File"moviepy\decorators.py",line54,inrequires_duration File"<decorator-gen-54>",line2,inwrite_videofile File"moviepy\decorators.py",line135,inuse_clip_fps_by_default File"<decorator-gen-53>",line2,inwrite_videofile File"moviepy\decorators.py",line22,inconvert_masks_to_RGB File"moviepy\video\VideoClip.py",line291,inwrite_videofile File"proglog\proglog.py",line257,in__call__ File"proglog\proglog.py",line350,incallback File"tqdm\std.py",line722,inwrite AttributeError:'NoneType'objecthas no attribute'write'从错误信息来看,异常发生在tqdm进度条库中,具体提示NoneType没有write方法,说明tqdm进度条的输出流未正确设置,导致None被调用write方法。
解决方案
调整tqdm的输出流
moviepy依赖tqdm来显示进度条,如果tqdm的输出流未正确初始化,就会导致NoneType相关错误。可以在write_videofile方法中显式指定日志参数,确保logger不是None,并尝试如下代码:
frommoviepy.editorimportVideoFileClip clip=VideoFileClip("your_video.mp4")clip.write_videofile("output_video.mp4",logger='bar',verbose=True,progress_bar=True)如果不需要日志和进度条,可以直接禁用logger:
clip.write_videofile("output_video.mp4",logger=None)部分moviepy版本可能存在 bug,建议升级moviepy和tqdm,确保使用最新版本:
pipinstall--upgrademoviepy tqdm某些环境(如 Jupyter Notebook、远程服务器或特定 IDE)可能会影响stdout,导致tqdm无法正确写入。可以尝试在终端直接运行脚本,或确保sys.stdout可用:
importsys sys.stdout=sys.__stdout__在尝试上述方法后,运行write_videofile时不再出现NoneType相关错误,视频文件成功生成。
该问题通常由tqdm进度条的write方法在None变量上调用引起,原因可能是stdout被重定向、环境问题或库版本问题。可以通过显式设置logger、更新moviepy和tqdm,或调整运行环境来解决。