【问题标题】:Python - Using multiple flags for winsound?Python - 为 winsound 使用多个标志?
【发布时间】:2017-06-12 06:42:53
【问题描述】:

这是我当前的代码:

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 存在,但似乎没有答案。

【问题讨论】:

  • 能否提供wav文件的链接,以便我重现错误
  • 添加了声音文件。

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


【解决方案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,它应该可以轻松地将循环音乐与偶尔并行播放的其他音效结合起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 2018-04-03
    • 1970-01-01
    • 2016-05-08
    • 2021-10-10
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多