1

我正在输出

parec -d "name"

你不需要知道这个命令,只要知道你一按回车,它就会输出代表音频的二进制数据。

我的目标是用python实时读取它,即启动它并将它放在一个变量“数据”中,我可以用类似的东西读取它

data = p.stdout.read()

我试过的

p = subprocess.Popen(['parec','-d','"name"'],stdout=subprocess.PIPE,shell=True)

while True:
   data = p.stdout.read()

但这导致没有接收到数据。

parec -d "name" > result.raw

可通过音频程序读取,并包含准确的必要数据。那么python的命令是什么?

4

2 回答 2

0

当您在 subprocess.PIPE 上调用 read() 时,我相信它会阻塞直到parec退出

我很确定这个解决方案不应该阻塞:)

找到解决方案

from subprocess import Popen, PIPE, STDOUT

p = Popen('c:/python26/python printingTest.py', stdout = PIPE, 
        stderr = PIPE)
for line in iter(p.stdout.readline, ''):
    print line
p.stdout.close()

花了很多时间搜索,但可以找到这个解决方案@Getting realtime output using subprocess

于 2013-05-19T23:51:41.843 回答
0

您不应该使用p.stdout.read()(这会等待所有数据)也不应该p.stdout.readline()(这会读取一个“行”数据,如果它是二进制的,这几乎没有意义)。相反,您可以使用p.stdout.read(4096)例如,它将等到 4096 字节存在并返回它们。

没有办法使用文件对象上的方法来读取“目前可用的所有内容”,但是如果您转到较低级别的文件句柄,则有一种方法:

data = os.read(p.stdout.fileno(), 4096)

这将等到至少有一个字节要读取,然后返回所有可用字节,最大长度为 4096。

我的示例中的数字 4096 有点随意。如果数据快速进入,您也可以使用更大的值。

于 2013-05-20T09:15:11.590 回答