Python subprocess调用FFmpeg合并视频失败,求排查原因
问题排查与解决
核心错误点
- 多余的引号字面量:你在
"concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2"里添加的双引号,会在subprocess列表传参且shell=True的场景下被FFmpeg当作输入路径的一部分,导致无法识别正确的concat协议路径。 - 参数拆分错误:
"-bsf:a aac_adtstoasc"是两个独立参数,应该拆分为"-bsf:a"和"aac_adtstoasc",否则FFmpeg会将其识别为无效选项。 - 缺失原命令的
-y参数:原Shell命令中的-y(自动覆盖输出文件)在Python代码中被遗漏,虽不是当前报错的直接原因,但可能导致后续输出文件存在时的额外问题。
修正后的代码
方式一:保持shell=True,用列表正确传参
import subprocess cmd = [ r"\programs\2d\ffmpeg\inst\ffmpeg.bat", "-y", "-i", "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2", "-c", "copy", "-bsf:a", "aac_adtstoasc", "C:/daten/movieConcat.mov" ] result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode > 0: print("create concat failed") print(result.stdout) print(result.stderr)
方式二:拼成完整命令字符串(适配shell=True场景)
如果觉得列表传参容易出错,可直接使用与Shell中完全一致的命令字符串:
import subprocess cmd = r'\programs\2d\ffmpeg\inst\ffmpeg.bat -y -i "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2" -c copy -bsf:a aac_adtstoasc C:/daten/movieConcat.mov' result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode > 0: print("create concat failed") print(result.stdout) print(result.stderr)
额外排查建议
- 校验路径有效性:确认
ffmpeg.bat、输入输出文件的路径在Python环境下可访问,可通过os.getcwd()查看当前工作目录,排查相对路径是否匹配。 - 测试基础调用:先执行
subprocess.run([r"\programs\2d\ffmpeg\inst\ffmpeg.bat", "-version"], shell=True),确认FFmpeg可正常启动,排除路径或权限问题。 - 尝试移除
shell=True:若直接调用ffmpeg.exe而非bat脚本,可去掉shell=True,列表传参更安全(需调整路径为ffmpeg.exe的实际位置,比如r"\programs\2d\ffmpeg\inst\bin\ffmpeg.exe")。
内容的提问来源于stack exchange,提问作者haggi krey
相关产品推荐
相关产品推荐

