我正在使用 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 进程将永远等待,前提是我将我的程序作为 shell 中的后台进程启动。在前台运行。
我想这与 shell 如何处理 stdio channel 以及它们如何被子进程继承有关,但我无法弄清楚。我尝试(未成功)在 shell 中重新建立此行为(使用重定向)。
有任何解释或文档指示吗?
PS: ffprobe 不会这样做。即使没有 stdin 参数,它也始终有效。所以它也是 ffmpeg 中触发此行为的东西。
最佳答案
如果您不以某种方式告诉它忽略 stdin
,它会期望图像本身(不仅仅是文件名)来自 stdin
,就好像您坐在在那里并逐字节输入图像。这对于 *nix 系统中的“管道”命令至关重要,但这意味着如果您不明确将它们定向到 stdin
以外的某些输入流,许多命令将看起来挂起。
关于linux - 为什么我的 ffmpeg 进程在没有 subprocess.run 的 stdin 参数的情况下永远等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126489/