2017-03-19 17 views
0

我的代碼是python。它調用espeak命令來生成.wav音頻。然後調用ffmpeg將wav轉換爲mp3。subprocess.call不能發送stdout到ffmpeg

但該命令不能從espeak的發送標準輸出通過蟒蛇的subprocess.call的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

你可以顯示示例代碼? – tdelaney

+0

我已編輯添加Python代碼。 – Bonn

+1

謝謝!如果您添加參數'shell = True',那麼該代碼應該可以工作......但是Ephemient的答案是我想要做的。 – tdelaney

回答

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()