pyaudio高級玩法1:pyaudio的非阻塞模式錄音
pyaudio是py常用的錄音和播放庫,使用方便,不過其錄音時會獨占進程。這就給實時的聲音處理帶來很多麻煩。
當然pyaudio是有非阻塞模式的,可以在百度上能搜到的,只有一些非阻塞模式播放聲音的代碼。悄悄告訴你,那些都是直接從pyaudio的官方英文文檔上原封不動copy下來的。pyaudio能不能使用非阻塞模式錄音呢?當然可以,文檔雖然沒有寫明,但是稍微改改就可以啦。
import?pyaudio
import?wave
import?time
#?instantiate?PyAudio?(1)
#?define?callback?(2)
#?open?stream?using?callback?(3)
CHUNK?=?1024
FORMAT?=?pyaudio.paInt16
CHANNELS?=?2
RATE?=?44100
p?=?pyaudio.PyAudio()
################################################3
wf?=?wave.open("output.wav",?'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
def?callback(in_data,?frame_count,?time_info,?status):
????wf.writeframes(in_data)
????return?(in_data,?pyaudio.paContinue)?
##################################################打開文件
stream?=?p.open(format=FORMAT,
????????channels=CHANNELS,
????????rate=RATE,
????????input=True,
????????frames_per_buffer=CHUNK,
????????stream_callback=callback)
#?start?the?stream?(4)
stream.start_stream()
#?wait?for?stream?to?finish?(5)
for?_?in?range(50):
????if?stream.is_active():
????????time.sleep(0.1)???#休眠,不影響錄音
#?stop?stream?(6)
stream.stop_stream()???#直到運行此句錄音終止
stream.close()
wf.close()
#?close?PyAudio?(7)
p.terminate()