ffmpeg Python 子进程错误返回非零退出状态1
我这里有一行代码,是用来通过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命令)则会作为单个列表元素处理。"