Python - 为winsound使用多个标志?

时间:2017-06-12 06:42:53

标签: python windows python-3.x audio wav

这是我目前的代码:

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:“ [Winsound]对[文件]的解释取决于flags的值,它可以是下面描述的常量的按位ORed组合

音乐本身以异步方式播放,并循环播放。但是,当上面的代码发出蜂鸣声时,它会抛出一个错误(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存在,但它似乎没有答案。

1 个答案:

答案 0 :(得分: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,它应该能够将环状音乐与偶尔播放的其他声音效果相结合。