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

Python subprocess调用FFmpeg合并视频失败,求排查原因

问题排查与解决

核心错误点

  1. 多余的引号字面量:你在"concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2"里添加的双引号,会在subprocess列表传参且shell=True的场景下被FFmpeg当作输入路径的一部分,导致无法识别正确的concat协议路径。
  2. 参数拆分错误:"-bsf:a aac_adtstoasc"是两个独立参数,应该拆分为"-bsf:a"和"aac_adtstoasc",否则FFmpeg会将其识别为无效选项。
  3. 缺失原命令的-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:53:26