Python中subprocess执行ffmpeg命令失败,终端运行正常
解决Python subprocess调用ffmpeg失败的问题
问题根源分析
你遇到的两个核心问题:
- Fontconfig环境变量缺失:subprocess默认不会完全继承终端的环境变量,Fontconfig依赖的
FONTCONFIG_FILE或FONTCONFIG_PATH未被设置,导致报错找不到默认配置文件。 - drawtext参数引号冗余:使用subprocess的列表模式传参时,不需要给字体路径加双引号——列表会自动处理参数分割,额外的引号会被当成路径的一部分,导致ffmpeg找不到字体文件。
具体修复步骤
1. 修正字体路径参数写法
去掉drawtext=fontfile="..."里的双引号,直接写路径即可:
FONT_LOC = 'C:/Users/acer/AppData/Local/Microsoft/Windows/Fonts/jf-openhuninn-1.1.ttf'
2. 给subprocess添加Fontconfig环境变量
在Windows下,Fontconfig的配置文件通常随ffmpeg安装,你可以手动指定FONTCONFIG_FILE路径,或者直接继承终端的环境变量确保配置能被找到:
import os import subprocess FONT_LOC = 'C:/Users/acer/AppData/Local/Microsoft/Windows/Fonts/jf-openhuninn-1.1.ttf' duration = '30' subtitle='abc' output_file = 'output_test' # 复制终端环境变量,确保Fontconfig能读取到配置 env = os.environ.copy() # 若明确知道fonts.conf路径,可手动指定,例如: # env['FONTCONFIG_FILE'] = 'C:/ffmpeg/etc/fonts/fonts.conf' comd = [ "ffmpeg", "-f", "lavfi", "-i", f"color=c=black:s=1280x720:d={duration}", "-vf", f'''drawtext=fontfile={FONT_LOC}:text='{subtitle}':fontcolor=white:fontsize=24:x=(w-text_w)/2:y=(h-text_h)/2''', "-c:v", "libx264", "-t", duration, "-pix_fmt", "yuv420p", f"{output_file}.mp4" ] # 打印命令确认参数(可选) print(' '.join(comd)) # 执行命令并传入环境变量 subprocess.run(comd, check=True, env=env)
3. 额外排查点
- 确认ffmpeg在系统PATH中,或直接使用绝对路径调用(如
"C:/ffmpeg/bin/ffmpeg")。 - 测试字体文件可访问性:在终端执行
ffmpeg -v debug -f lavfi -i color=c=black:s=100x100:d=1 -vf drawtext=fontfile={FONT_LOC}:text='test' test.mp4,查看详细日志确认路径是否正确。
内容的提问来源于stack exchange,提问作者will
相关产品推荐
相关产品推荐

