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

2024-04-29 03:49:08 发布

您现在位置:Python中文网/ 问答频道 /正文

此ffmpegPopen调用起作用:

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

我如何传递复杂的论点?在


Tags: framesredfilterfilenameprocessspffmpegtmp
1条回答
网友
1楼 · 发布于 2024-04-29 03:49:08

这些只是常规的Python字符串。字符串值直接传递给FFmpeg,而不需要shell进行任何解释。在

所以当你看到这样的命令行示例时

ffmpeg -i input -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png

首先,由于示例被传递给shell,我们必须“撤消”shell引用。在

^{pr2}$

然后,我们将其放入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只是有点冗长,但更规则。在

相关问题 更多 >