为什么我的ffmpeg命令在Python子进程中失败?

-2 投票
1 回答
50 浏览
提问于 2025-04-12 23:25

我想用ffmpeg把两个电影合并在一起。在命令行里,我可以这样执行:

\\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

这样运行得很好。但是如果我尝试从Python的子进程中调用它:

import subprocess
cmd = [r"\\programs\2d\ffmpeg\inst\ffmpeg.bat", "-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)

我就会遇到这个错误:

Trailing option(s) found in the command: may be ignored.
[in#0 @ 00000222c056a1c0] Error opening input: Invalid argument
Error opening input file "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2".
Error opening input files: Invalid argument

我不知道我的调用哪里出了问题,希望能得到一些提示。

1 个回答

1

在Windows系统上,如果你传入的参数是一个序列(比如列表),它会按照某种方式被转换成字符串,具体的转换方法可以参考Windows上参数序列转换为字符串。这是因为底层的CreateProcess()函数是基于字符串来工作的。

来源: https://docs.python.org/3/library/subprocess.html

你可以尝试把命令作为一个单独的字符串传入,命令之间用 ' && ' 连接。

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)

撰写回答