Python:将复杂(ffmpeg)参数传递给Popen

时间:2016-06-24 22:12:02

标签: python ffmpeg subprocess

此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调用中可以找到的所有内容。

如何传递复杂的参数?

1 个答案:

答案 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只是更冗长,但更经常。