在开发过程中,我们有时需要在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()
|