Python通过subprocess调用FFmpeg出现FileNotFoundError的修复方法
修复subprocess调用FFmpeg的错误
错误原因分析
- subprocess参数格式错误:
subprocess.run([subprocess_cmd])将整个命令字符串作为单个元素传入列表,subprocess会把这个完整字符串当作程序名去执行,而非解析为命令+参数,导致系统找不到对应文件。 - 路径转义问题:未正确处理路径中的反斜杠(如
'\src\img\\'),可能引发转义字符解析错误,比如\s会被识别为特殊字符。 - 文件名多余空格:
imagefile和mp4_file末尾添加的空格,会让FFmpeg误认为文件名包含空格,进而找不到目标文件。 - FFmpeg路径未配置:若FFmpeg未添加到系统环境变量
PATH中,系统无法直接找到FFmpeg可执行文件。
修复步骤
- 拆分命令参数:将FFmpeg命令拆分为列表形式,每个参数作为独立元素,避免shell解析冲突。
- 修正路径写法:使用原始字符串(前缀
r)或双反斜杠定义路径,确保路径解析正确。 - 移除文件名空格:删除文件名末尾的多余空格,保证文件名匹配正确。
- 指定FFmpeg完整路径(可选):若系统
PATH中无FFmpeg,直接传入FFmpeg可执行文件的完整路径(如r"C:\ffmpeg\bin\ffmpeg.exe")。
修改后的代码
import subprocess import os.path SCRIPT_FILE = os.path.realpath(__file__) DIRECTORY = os.path.dirname(SCRIPT_FILE) # 用原始字符串避免转义问题 DATA = r'\src\img\' DATA2 = r'\src\mp4\' SAVEFILE = DIRECTORY + DATA SAVEFILE2 = DIRECTORY + DATA2 def make_plain_video(imagefile, mp4_file): # 将命令拆分为独立参数列表 return [ "ffmpeg", # 若FFmpeg不在PATH,替换为完整路径如r"C:\ffmpeg\bin\ffmpeg.exe" "-loop", "1", "-i", imagefile, "-c:v", "libx264", "-t", "60", "-pix_fmt", "yuv420p", "-vf", "scale=1080:1920", mp4_file ] # 移除文件名末尾多余空格 imagefile = SAVEFILE + "background.jpeg" mp4_file = SAVEFILE2 + "plain_video.mp4" subprocess_cmd = make_plain_video(imagefile, mp4_file) # 直接传入参数列表执行 sub = subprocess.run(subprocess_cmd, check=True) # check=True可在执行失败时抛出异常,便于调试 print(" ".join(subprocess_cmd))
额外说明
- 添加
check=True后,若FFmpeg执行失败,subprocess会直接抛出异常,更便于定位问题。 - 若仍出现FFmpeg找不到的错误,需确认FFmpeg是否安装完成,或是否已添加到系统环境变量
PATH中,也可直接在命令列表中指定FFmpeg的完整路径。
内容的提问来源于stack exchange,提问作者Rainer
相关产品推荐
相关产品推荐

