我正在使用python子进程模块像这样调用ffmpeg:
def ffmpeg_wait(self, fname, args):
ffmpeg = subprocess.run([
'ffmpeg', '-v', 'quiet', '-i', fname, *args],
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
universal_newlines=True)
print('terminated')
(out,err) = (ffmpeg.stdout, ffmpeg.stderr)
return out + err
这很好。调用示例:
self.ffmpeg_wait(fname,
['-r', str(sps), '-s', '320x240', '-f', 'image2', 'tmp/%06d.png'])
我想知道的是为什么当我省略stdin
参数时它不起作用。在这种情况下,如果我在外壳程序中将我的程序作为后台进程启动,则 ffmpeg 进程将永远等待。在前台运行有效。
我想这与外壳如何处理stdio通道以及它们如何被子进程继承有关,但是我无法弄清楚。我尝试(未成功)在shell中(使用重定向)重新建立此行为。
有任何解释或文档指针吗?
PS: ffprobe 不这样做。即使没有 stdin 参数,它也始终有效。因此, ffmpeg 中也会触发这种行为。
答案 0 :(得分:1)
如果您不以某种方式告诉它忽略stdin
,它会期望图像本身(不仅仅是文件名)来自stdin
,就像您坐在那里并键入图像一样逐字节。这对于在* nix系统中“管道”命令是必不可少的,但是这意味着,如果您未将命令明确定向到stdin
以外的其他输入流,则许多命令似乎会挂起。