0%

Python使用Pipe控制命令行输入输出

在开发过程中,我们有时需要在python中调用诸如ffmpeg这样的命令。此时就不可避免的需要用到pipe。

当我们仅需要使用输入或输出时,可以直接指定stdin/stdout/stderr为Pipe,但是当我们需要同时使用输入输出时,直接使用pipe的读写时无法工作的。

此时只能使用pipe.communicate方法,通过这种一锤子买卖一次性把所有的输入设置完,并读取所有的输出。

下面的例子是一个使用pipe将音频文件的字节流送给ffmpeg处理,并且从ffmpeg读取处理结果的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import subprocess
import numpy as np

# init command
# set ffmpeg read write to pipe
ffmpeg_command = ["ffmpeg", "-f", "aac","-i", "-", "-f", "wav", "-"]

# excute ffmpeg command
pipe = subprocess.Popen(ffmpeg_command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
bufsize=1024*1024*128)

# get you byte stream from anywhere
with open("audio.aac", "rb") as f:
data = f.read()

# only way you can read and write in same time
output, stderr = pipe.communicate(data)

with open("test.wav", "wb") as f:
data = output
print(len(data))
f.write(data)
pipe.wait()