python - subprocess.call 无法将标准输出发送到 ffmpeg

标签 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(" "))

错在哪里?我该怎么办?

最佳答案

您编写的管道由 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 - subprocess.call 无法将标准输出发送到 ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42892896/

相关文章:

python - Tkinter 嵌入图形子流程

python - 使用python的子进程通过curl下载文件

python:将数据帧放入字典中

python - 忽略 for 循环中丢失的文件 - Python

python - 我需要在本地PC上安装MySQL才能使用MySQLdb for Python远程连接MySQL服务器吗?

linux - 根据文本文件中的单词检查用户输入

python - Selenium 不随机点击(无错误代码)

linux - 从另一个脚本调用脚本时想要摆脱 std out

linux - Linux 上的 X11 网络

python - 如何使用子进程拦截 "pipenv install"spinner-like 输出消息?