2017-05-03 137 views
2

所以我有代碼看起來像這樣:如何阻止在Python中播放的聲音?

import winsound 
    from msvcrt import getch 

    sound_path = "Path to sound" 

    while True: 
     key= ord(getch()) 
     if key == 27: 
      break 
     if key == 113: #theq key 
      winsound.PlaySound(sound_path, winsound.SND_FILENAME) 

所以,現在如果我按「Q」鍵,播放相應的聲音像它應該。但是,如果在當前聲音播放完畢之前按住「q」鍵,則在當前聲音結束後播放。按下'q'按鈕後我怎麼會這樣做,它會阻止當前的噪音並播放下一個?

回答

3

編輯: 已經進一步看着它(Win7的,Python3.6.1),Eswcvlads答案是要走的路。當使用winsound.SND_ASYNC標誌時,您可以立即播放另一個聲音,並且當前播放的聲音停止。

winsound.PlaySound(r'D:\seven_11.wav', winsound.SND_ASYNC) 

- >扮演seven_11

winsound.PlaySound(r'D:\seven_12.wav', winsound.SND_ASYNC) 

- > seven_11站和seven_12開始播放

然而,停止所有的播放,我原來的做法仍然是有效的:

winsound.PlaySound(None, winsound.SND_PURGE) 

docs

winsound.PlaySound(sound, flags) ......如果聲音參數爲None,目前播放的波形聲音停止。

因此,在爲下一個PlaySound調用PlaySound之前,應該在開始下一個之前停止播放。

+0

就像你說的那樣嘗試'winsound.Playoud(None,winsound.SND_FILENAME),但是當我像那樣運行程序時,程序崩潰了。運行良好,沒有這條線。 –

+0

@JoshuaKim它以什麼方式崩潰? 「Playsoud」與「PlaySound」不同。 –

+0

測試過它,編輯我的回答 –

2

通過docs來判斷,默認情況下,PlaySound是同步的,所以只有在聲音播放完畢後纔會返回。所以腳本只有在聲音結束時才處理下一個鍵。爲了使異步使用winsound.SND_ASYNC標誌是這樣的:

winsound.PlaySound(sound_path, winsound.SND_FILENAME | winsound.SND_ASYNC) 
2
if key == 113: #theq key 
     winsound.Playsound(None, windsound.SND_FILENAME) 
     winsound.PlaySound(sound_path, winsound.SND_FILENAME) 

如果聲音參數爲空,任何當前播放的波形聲音停止。所以在每個聲音文件播放前都要這樣做。