2017-08-16 143 views
0
import pyaudio 
import numpy as np 
import time 

RATE=44100 
pa = pyaudio.PyAudio() 
stream = pa.open(format=pyaudio.paFloat32, 
           channels=1, 
           rate=RATE, 
           output=True) 
t = time.time() 
output = np.ones(44100)*100 
stream.write(output) 
print(time.time()-t) 

这是一个测试代码。采样率为44100时,玩44100个采样时,时间成本应为1s。但是,输出不是。为什么会发生?我期待别人的回答。非常感谢你。使用PyAudio以44100采样率播放44100个采样时,为什么不花费1秒的时间?

+0

什么是输出? –

回答

1

声明:未经测试,只需查看API。

stream.write()需要一个定义格式的字符串(这里是:32bit-floatingpoint)。但是你传递一个句柄给一个numpy数组。 PyAudio(可能)默认将传递的值转换为一个字符串。没有进一步修改的输出的字符串表示是:

array([ 100., 100., 100., ..., 100., 100., 100.]) 

或42字节或2.3ms播放时间。

尝试stream.write('\0\0\0\0'*44100)。要使用一般np.ones()或numpy的阵列,你必须使用正确的数据类型(你定义的格式是paFloat32):

output = np.ones(44100, dtype=np.float32).tobytes() 
+0

我在stream.write()之前添加了一个代码output.tostring()。但结果表明它花费了大约2s。 – Roger

+0

那是因为如果数据类型未定义,numpy默认为双倍(64位)。已更新的答案... –

+0

非常感谢。 – Roger