gpt4 book ai didi

Python - 对winsound使用多个标志?

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:46 27 4
gpt4 key购买 nike

这是我当前的代码:

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] 对文件的解释取决于标志的值,该值可以是下面描述的常量的按位或组合

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

最佳答案

你梳理旗帜的效果很好;这不是问题。问题是您使用的 API 不支持一次播放多个声音。

换句话来说,抛出异常是因为已经有声音正在循环播放。 SND_NOSTOP 标志仅在您想要防止当前播放的声音被中断时有用;引发异常表明声音正在播放。如果没有标志,旧声音将停止并播放新声音。

winsound Python 模块只不过是 Windows API PlaySound function 的一个薄包装器。 ,其中指出:

SND_NOSTOP
The specified sound event will yield to another sound event that is already playing in the same process. If a sound cannot be played because the resource needed to generate that sound is busy playing another sound, the function immediately returns FALSE without playing the requested sound.

If this flag is not specified, PlaySound attempts to stop any sound that is currently playing in the same process. Sounds played in other processes are not affected.

仅当当前没有其他内容播放时,才使用该标志乐观地播放声音:

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这使得将循环音乐与偶尔并行播放的其他音效结合起来变得微不足道。

关于Python - 对winsound使用多个标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44492900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com