Windows环境下Python subprocess调用ffmpeg遇FileNotFoundError求助
解决subprocess调用ffmpeg时的FileNotFoundError问题
你已经配置了ffmpeg环境变量但还是报错,大概率是这几个原因,按顺序排查:
- 重启你的Jupyter Notebook/终端:环境变量修改后,已打开的程序不会自动读取新的环境变量,必须重启进程才能生效。这是最常见的坑,先试这个。
- 验证ffmpeg是否真的能在命令行运行:打开新的命令提示符(cmd),输入
ffmpeg -version,如果能正常输出版本信息,说明环境变量没问题;如果不行,检查系统变量Path里是不是真的加了ffmpeg的bin目录(比如C:\ffmpeg\bin),确认后重启命令行再试。 - 手动指定ffmpeg的完整路径:如果环境变量还是不生效,直接在代码里写ffmpeg的绝对路径,比如把
'ffmpeg'改成'C:/ffmpeg/bin/ffmpeg.exe'(注意用斜杠/或者双反斜杠\\)。 - 在代码里添加ffmpeg存在性检查:用
shutil.which()提前验证是否能找到ffmpeg,避免笼统的异常提示,代码更健壮。
修改后的代码示例
import os import subprocess import shutil # 先检查ffmpeg是否可用 ffmpeg_path = shutil.which('ffmpeg') if not ffmpeg_path: raise Exception("找不到ffmpeg,请确认已安装并添加到环境变量,或直接指定ffmpeg路径") # 检查assets文件夹 if not os.path.exists("assets"): raise Exception("请创建assets文件夹并放入MKV文件") # 创建results文件夹 if not os.path.exists("results"): os.mkdir("results") mkv_list = os.listdir("assets") converted_count = 0 for mkv in mkv_list: name, ext = os.path.splitext(mkv) if ext.lower() != ".mkv": print(f"跳过非MKV文件:{mkv}") continue output_name = name + ".mp4" input_path = os.path.join("assets", mkv) output_path = os.path.join("results", output_name) try: # 用找到的ffmpeg路径调用 subprocess.run( [ffmpeg_path, '-i', input_path, "-codec", "copy", output_path], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) converted_count += 1 print(f"转换完成:{mkv} -> {output_name}") except subprocess.CalledProcessError as e: raise Exception(f"转换{ mkv }失败:{ e.stderr }") except Exception as e: raise Exception(f"执行出错:{ str(e) }") print(f"{converted_count}个视频已转换完成") os.startfile("results")
额外优化点
- 用
os.path.join()拼接路径,避免不同系统的路径分隔符问题 - 处理小写的
.mkv后缀(比如.MKV) - 跳过非MKV文件而不是直接终止程序
- 捕获具体的
subprocess.CalledProcessError,打印ffmpeg的错误输出,方便排查转换失败的原因 - 修复了原代码中"ben"的拼写错误(改为"been")
内容的提问来源于stack exchange,提问作者mahmoudamintaha
相关产品推荐
相关产品推荐

