我正在編程一個音頻程序,它讀取由arduino發送的串行信息,並在串行信息爲「ok」時播放一些歌曲,如果是「不好」則停止播放。 問題是,我正在使用python庫名稱「pyAudio」,它將一個.wav聲音再現爲一個字節流,因此migth是一個'while'循環,每次都會寫入字節流,所以聲音播放。 由於這個while循環,我不能在執行代碼的同時做更多的事情。但我需要每次讀取串行信息以瞭解是否必須播放聲音。有沒有辦法讓我以循環不停止運行的方式進行串行讀取?Python'多任務'需要
謝謝!
我正在編程一個音頻程序,它讀取由arduino發送的串行信息,並在串行信息爲「ok」時播放一些歌曲,如果是「不好」則停止播放。 問題是,我正在使用python庫名稱「pyAudio」,它將一個.wav聲音再現爲一個字節流,因此migth是一個'while'循環,每次都會寫入字節流,所以聲音播放。 由於這個while循環,我不能在執行代碼的同時做更多的事情。但我需要每次讀取串行信息以瞭解是否必須播放聲音。有沒有辦法讓我以循環不停止運行的方式進行串行讀取?Python'多任務'需要
謝謝!
def play_audio(buffer,play_controller):
# buffer is the audio buffer to play
# play_controller.is_set lets you pause the playback
while not_finished:
if not play_controller.is_set():
"""
The necessary code for playing a audio buffer/song
"""
else: time.sleep(0.1)
#end
import threading
pause_handler = threading.Event()
player = threading.Thread(
target = play_audio,
args = (buffer,pause_handler)
)
player.start()
pause_handler.set() # this could pause playback
pause_handler.clear() # this could restart playback
如果我理解正確的你。正如你所看到的,這很直截了當。
GStreamer
here。對於串行讀取來說,多處理並不更容易嗎?對我來說會好很多! – user2483347
您可以用串行方式填充音頻數據的緩衝區,並且使用'threading.Event()'作爲暫停或'ok'變量。 – jorgenkg
這可以通過**線程**和**隊列**模塊來解決。有很多方法可以處理這個問題,但通常你創建一個線程來讀取每個阻塞事件,並通過Queue將它們讀取的內容傳遞給主線程,以便處理它。 – tdelaney
還有帶發生器和協同程序的源濾波器 - 接收器模式 - 請參閱http://www.dabeaz.com/coroutines/。 –
你可以使用['callback' API來避免阻塞循環](http://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o)。 – jfs