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

FFMPEG输出文件被进程占用 删除时报WinError 32错误如何解决

问题原因
  • 核心触发点是VideoFileClip对象加载临时视频文件后,会持续持有该文件的操作系统句柄,你在未释放该句柄的情况下直接执行删除操作,就会触发文件占用报错。之前仅处理音频时没有加载视频文件的步骤,自然不会出现该问题。
  • 代码存在额外的路径匹配错误:生成的音频文件存储路径为./Media/ShortSounds/temp.mp3,但加载音频时写的路径是./Media/Videos/temp.mp3,会导致后续音频加载失败,也需要同步修正。
解决方案

你可以根据自己的业务需求选择以下任意一种方案:

  1. 延后删除临时文件
    如果你需要将t对象保留在templist中后续使用,不要提前删除临时文件,等所有对t对象的操作完成后,先显式关闭对象释放句柄,再执行删除:
# 所有对t的操作执行完毕后运行
t.close()
if t.audio:
    t.audio.close()
remove("./Media/Videos/temp.mp4")
remove("./Media/ShortSounds/temp.mp3")
  1. 预加载资源到内存后直接释放句柄
    如果你的视频文件体积不大,可以在加载时指定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")
  1. 优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 15:18:03