此ffmpeg Popen调用有效:
command = ['ffmpeg', '-y',
'-i', filename,
'-filter_complex', 'showwavespic',
'-colorkey', 'red',
'-frames:v', '1',
'-s', '800:30',
'-vsync', '2',
'/tmp/waveform.png']
process = sp.Popen( command, stdin=sp.PIPE, stderr=sp.PIPE)
process.wait()
但我需要使用'compand, showwavespic',这个逗号似乎阻止了执行。 I also need to pass all sorts of strange characters,就像列一样,以及您在CLI调用中可以找到的所有内容。
如何传递复杂的参数?
答案 0 :(得分:3)
这些只是常规的Python字符串。字符串值直接传递给FFmpeg,而没有shell的任何解释。
所以当你看到像这样的命令行示例时,
ffmpeg -i input -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png
首先,由于示例传递给shell,我们必须"撤消"外壳引用。
ffmpeg
-i
input
-filter_complex
showwavespic=s=640x120
-frames:v
1
output.png
然后,我们将它放入Python列表中。
command = [
'ffmpeg',
'-i',
'input',
'-filter_complex',
'showwavespic=s=640x120',
'-frames:v',
'1',
'output.png',
]
正如您所看到的,逗号,空格和大多数其他字符的处理方式不同,因此您无需引用它们。主要的特殊字符是必须引用的\
和'
,必须引用的控制字符,以及根本不能使用的NUL字符。
在shell中:
ffmpeg -i in.mp4 -ac 2 -filter_complex:a '[0:a]aresample=8000,asplit[l][r]' \
-map '[l]' -c:a pcm_s16le -f data /tmp/plot-waveform-ac1 \
-map '[r]' -c:a pcm_s16le -f data /tmp/plot-waveform-ac2
在Python中:
command = [
'ffmpeg',
'-i', 'in.mp4',
'-ac', '2',
'-filter_complex:a', '[0:a]aresample=8000,asplit[l][r]',
'-map', '[l]',
'-c:a', 'pcm_s16le',
'-f', 'data',
'/tmp/plot-waveform-ac1',
'-map', '[r]',
'-c:a', 'pcm_s16le',
'-f', 'data',
'/tmp/plot-waveform-ac2',
]
如你所见,相当简单。 Python只是更冗长,但更经常。