2017-08-16 77 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