使用subprocess.call()传递FFmpeg参数失败,重定向部分出错
解决Python subprocess调用FFmpeg带错误重定向的问题
我来帮你搞定这个问题!你遇到的核心问题是:Windows命令提示符里的2> test.txt是shell层面的错误流重定向语法,但subprocess默认是直接把参数传给FFmpeg进程,不会让shell解析这些符号,所以FFmpeg会把2>和test.txt当成无效的命令参数,自然报错。
下面给你两种靠谱的解决方案,推荐第二种更安全的方式:
方案1:启用shell解析(简单但有安全风险)
如果你想完全照搬cmd里的命令写法,可以让subprocess调用shell来解析整个命令字符串。注意要正确转义引号:
import subprocess # 用单引号包裹整个命令,内部双引号直接保留,单引号转义 cmd = 'ffmpeg -i test.mp4 -filter:v "select=\'gt(scene,0.4)\',showinfo" -f null - 2> test.txt' subprocess.call(cmd, shell=True)
⚠️ 注意:如果你的命令里包含用户输入的内容,shell=True可能会带来命令注入风险,不推荐在生产环境用。
方案2:用subprocess原生重定向(推荐,安全跨平台)
更专业的做法是跳过shell,直接用subprocess的stderr参数来处理错误输出的写入,这样既安全又跨平台(Linux/Windows都能用):
import subprocess # 打开要写入错误日志的文件,用'w'模式覆盖原有内容 with open('test.txt', 'w', encoding='utf-8') as error_log: subprocess.call( [ 'ffmpeg', '-i', 'test.mp4', '-filter:v', "select='gt(scene,0.4)',showinfo", # 这里用双引号包裹filter参数,内部单引号无需转义 '-f', 'null', # 拆分每个参数,-f 和 null 是两个独立元素 '-' # 代表输出到标准输出,我们不需要实际内容,所以用这个占位 ], stderr=error_log # 把FFmpeg的标准错误流直接写入文件 )
关键注意点:
- 列表传参时,每个空格分隔的命令部分都要拆成独立元素:比如
-f null -要拆成'-f'、'null'、'-'三个元素,不能合并成'null -'。 - 过滤器参数
select='gt(scene,0.4)',showinfo作为一个完整的字符串放在列表里即可,Python会正确传递给FFmpeg,不需要额外转义(只要用双引号包裹整个过滤器字符串,内部单引号就不会冲突)。
这样修改后,你的Python脚本应该就能和cmd里的命令一样正常工作了!
内容的提问来源于stack exchange,提问作者Peter F
相关产品推荐
相关产品推荐

