subprocess.call无法将stdout发送到ffmpeg

时间:2017-03-19 22:08:25

标签: python linux subprocess espeak

我的代码是python。它调用espeak命令来生成.wav音频。然后调用ffmpeg将wav转换为mp3。

但是这个命令不能通过python的subprocess.call从espeak发送stdout到ffmpeg:

espeak -f myfile --stdout | ffmpeg -i - final.mp3

示例:

subprocess.call(["espeak", "test text to speak", "--stdout", "|"]+("ffmpeg -i - -vn -y -ar 22050 -ac 1 -ab 16k -af volume=2 -f mp3 mp3OutFile.mp3").split(" "))

错误是什么?我该怎么办?

1 个答案:

答案 0 :(得分:4)

您编写的管道由shell处理,除非您使用shell=True,否则将无法正常工作(如编写)。不应该这样做,你应该在Python中构建管道,这对于subprocess非常简单:

p1 = subprocess.Popen(['espeak', '-f', 'myfile', '--stdout'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['ffmpeg', '-i', '-', 'final.mp3'], stdin=p1.stdout)
p1.stdout.close()  # pipe is already attached to p2, and unneeded in this process
p2.wait()
p1.wait()