FFMPEG输出文件被进程占用 删除时报WinError 32错误如何解决
问题原因
- 核心触发点是
VideoFileClip对象加载临时视频文件后,会持续持有该文件的操作系统句柄,你在未释放该句柄的情况下直接执行删除操作,就会触发文件占用报错。之前仅处理音频时没有加载视频文件的步骤,自然不会出现该问题。 - 代码存在额外的路径匹配错误:生成的音频文件存储路径为
./Media/ShortSounds/temp.mp3,但加载音频时写的路径是./Media/Videos/temp.mp3,会导致后续音频加载失败,也需要同步修正。
解决方案
你可以根据自己的业务需求选择以下任意一种方案:
- 延后删除临时文件
如果你需要将t对象保留在templist中后续使用,不要提前删除临时文件,等所有对t对象的操作完成后,先显式关闭对象释放句柄,再执行删除:
# 所有对t的操作执行完毕后运行 t.close() if t.audio: t.audio.close() remove("./Media/Videos/temp.mp4") remove("./Media/ShortSounds/temp.mp3")
- 预加载资源到内存后直接释放句柄
如果你的视频文件体积不大,可以在加载时指定preload=True把资源全量加载到内存,加载完成后手动关闭底层文件句柄,即可直接删除临时文件:
# 加载时开启预加载 t = VideoFileClip("./Media/Videos/temp.mp4", preload=True) # 修正音频路径,同时开启音频预加载 audio = AudioFileClip("./Media/ShortSounds/temp.mp3", preload=True) t.audio = audio templist.append(t) # 手动释放底层文件句柄 t.reader.close() t.audio.reader.close_proc() # 此时已无句柄占用,可以正常删除临时文件 remove("./Media/Videos/temp.mp4") remove("./Media/ShortSounds/temp.mp3")
- 优化ffmpeg调用逻辑
Windows环境下os.system调用ffmpeg偶尔会出现进程退出但文件句柄未及时回收的问题,可以改用subprocess模块显式等待进程执行完成,稳定性更高:
import subprocess # 替换原有的os.system调用,示例如下 subprocess.run( ["ffmpeg", "-i", paths[dex], "-vf", f"setpts={vfactor}*PTS", "-an", "./Media/Videos/temp.mp4"], check=True )
内容的提问来源于stack exchange,提问作者Tyler Bacon
相关产品推荐
相关产品推荐

