ffmpeg Python 子进程错误返回非零退出状态1

4 投票
2 回答
9654 浏览
提问于 2025-04-18 15:33

我这里有一行代码,是用来通过Python和ffmpeg从电影中提取帧的。

subprocess.check_output([ffmpeg, "-i", self.moviefile, "-ss 00:01:00.000 -t 00:00:05 -vf scale=" + str(resolution) + ":-1 -r", str(framerate), "-qscale:v 6", self.processpath + "/" + self.filetitles + "-output%03d.jpg"])

但现在它给我报错:

'CalledProcessError: Command ... returned non-zero exit status 1'

Python显示的命令是:

'['/var/lib/openshift/id/app-root/data/programs/ffmpeg/ffmpeg', '-i', u'/var/lib/openshift/id/app-root/data/moviefiles/moviename/moviename.mp4', '-ss 00:01:00.000 -t 00:00:05 -vf scale=320:-1 -r', '10', '-qscale:v 6', '/var/lib/openshift/id/app-root/data/process/moviename/moviename-output%03d.jpg']'

但是当我通过ssh运行以下命令时...

'/var/lib/openshift/id/app-root/data/programs/ffmpeg/ffmpeg' -i '/var/lib/openshift/id/app-root/data/moviefiles/moviename/moviename.mp4' -ss 00:01:00.000 -t 00:00:05 -vf scale=320:-1 -r 10 -qscale:v 6 '/var/lib/openshift/id/app-root/data/process/moviename/moviename-output%03d.jpg'

它运行得很好。我到底哪里出错了?我觉得我可能对子进程的字段解析理解得不太对...

2 个回答

2

你传给 check_call 的参数数组格式不对。每个传给 ffmpeg 的参数都应该是参数列表中的一个单独元素,比如说

... "-ss 00:01:00.000 -t 00:00:05 -vf ...

应该改成

... "-ss", "00:01:00.000", "-t", "00:00:05", "-vf", ...

最终得到的参数数组应该是:

['ffmpeg', '-i', '/var/lib/openshift/id/app-root/data/moviefiles/moviename/moviename.mp4', '-ss', '00:01:00.000', '-t', '00:00:05', '-vf', 'scale=320:-1', '-r', '10', '-qscale:v', '6', '/var/lib/openshift/id/app-root/data/process/moviename/moviename-output%03d.jpg']
3

subprocess模块几乎不允许在它的参数中使用空格字符,除非你在shell模式下运行。你可以试试这个:

subprocess.check_output(["ffmpeg", "-i", self.moviefile, "-ss", "00:01:00.000", "-t", "00:00:05", "-vf", "scale=" + str(resolution) + ":-1", "-r", str(framerate), "-qscale:v", "6", self.processpath + "/" + self.filetitles + "-output%03d.jpg"])

这里引用了Python文档中的内容。

"特别注意,选项(比如 -input)和参数(比如 eggs.txt)在shell中用空格分开时,会放在不同的列表元素中,而在shell中需要用引号或反斜杠转义的参数(比如包含空格的文件名或上面提到的echo命令)则会作为单个列表元素处理。"

撰写回答