【问题标题】:subprocess.call can not send stdout to ffmpegsubprocess.call 无法将标准输出发送到 ffmpeg
【发布时间】:2017-03-19 22:08:25
【问题描述】:

我的代码是 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(" "))

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

【问题讨论】:

  • 你能展示示例代码吗?
  • 我已经编辑添加了python代码。
  • 谢谢!如果您添加参数 shell=True ,该代码应该可以工作......但是 ehemient 的答案是我更愿意做的。

标签: python linux subprocess espeak


【解决方案1】:

您编写的管道由 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2016-12-03
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多