subprocess.call 无法将标准输出发送到 ffmpeg
subprocess.call can not send stdout to ffmpeg
我的密码是python。它调用 espeak 命令生成 .wav 音频。然后调用ffmpeg将wav转mp3。
但是这个命令不能通过 python 的 subprocess.call 从 espeak 发送标准输出到 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(" "))
哪里出错了?我该怎么办?
您编写的管道由 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()
我的密码是python。它调用 espeak 命令生成 .wav 音频。然后调用ffmpeg将wav转mp3。
但是这个命令不能通过 python 的 subprocess.call 从 espeak 发送标准输出到 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(" "))
哪里出错了?我该怎么办?
您编写的管道由 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()