2017-06-12 67 views
1

这是我的当前代码:Python - winsound使用多个标志?

import winsound as wav 

wav.PlaySound("music.wav", wav.SND_LOOP | wav.SND_ASYNC) 
input() 
wav.PlaySound("beep.wav", wav.SND_ASYNC | wav.SND_NOSTOP) 

python winsound documentation:“[广州市运生的] [文件]解释取决于标志的值,它可以是下面描述的常量的位或组合“

音乐本身异步播放,并循环播放。然而,当上面的代码播放哔哔声,它引发错误(sprites.py是代码的文件):

Traceback (most recent call last): 
    File ".../sprites.py", line 5, in <module> 
    wav.PlaySound("beep.wav", wav.SND_ASYNC | wav.SND_NOSTOP) 
RuntimeError: Failed to play sound 

交换SND_ASYNCSND_NOSTOP产生相同误差,并且在蜂鸣播放除去SND_NOSTOP结果,但音乐被切断。

为什么会发生这种情况,如果不能修复,有没有另一种方法可以在不切断音乐的情况下发出嘟嘟声?

声音文件是here,如果这很重要。

This question存在,但它似乎没有答案。

+0

你能否提供wav文件的链接,以便我可以重现错误 –

+0

添加声音文件。 – Dova

回答

1

你正在梳理标志就好了;这不是问题。问题是您使用的API不支持一次播放多个声音。

换句话说,由于在循环中已经播放了声音,因此抛出异常。 SND_NOSTOP标志仅用于防止正在播放的声音被打断;会引发例外,表明声音正在播放。如果没有标志,旧的声音将停止并播放新的声音。

winsound Python模块比Windows API PlaySound function周围薄薄的包装,其中规定更小:

SND_NOSTOP
指定声音事件将产生另一个已在同一播放的声音事件处理。如果因为生成该声音所需的资源忙于播放另一个声音而无法播放声音,该功能立即返回FALSE而不播放所需的声音。

如果未指定此标志,PlaySound会尝试停止当前正在同一进程中播放的任何声音。其他进程播放的声音不受影响。

使用标志乐观播放声音只有在没有其他正在播放:

try: 
    wav.PlaySound("beep.wav", wav.SND_ASYNC | wav.SND_NOSTOP) 
except RuntimeError: 
    # sound api busy with another sound, tough luck 
    pass 

为了同时播放声音,你需要一个可以混合声音的API; PlaySound不能这样做,并且标准库中没有其他东西可以。

您需要的东西不是让您使用DirectSound API。像pyglet library一样。这个库包括一个出色的audio API,它应该可以将并发音乐和偶尔并行播放的其他音效结合起来。