如何在Python中播放声音而不打断音乐或其他声音

7 投票
2 回答
2835 浏览
提问于 2025-04-15 18:23

我正在用Python做一个定时器,当等待时间结束时会发出铃声。我用的代码是:

from wave import open as wave_open
from ossaudiodev import open as oss_open

def _play_chime():
    """
    Play a sound file once.

    """
    sound_file = wave_open('chime.wav','rb')
    (nc,sw,fr,nf,comptype, compname) = sound_file.getparams( )
    dsp = oss_open('/dev/dsp','w')
    try:
      from ossaudiodev import AFMT_S16_NE
    except ImportError:
      if byteorder == "little":
        AFMT_S16_NE = ossaudiodev.AFMT_S16_LE
      else:
        AFMT_S16_NE = ossaudiodev.AFMT_S16_BE
    dsp.setparameters(AFMT_S16_NE, nc, fr)
    data = sound_file.readframes(nf)
    sound_file.close()
    dsp.write(data)
    dsp.close()

这个效果还不错,除非其他设备已经在播放声音。

我该如何在Linux下做到类似的事情,而不需要确保没有声音在播放呢?

如果你觉得这个过程需要一个API来确保软件混音,请推荐一种方法 :)

谢谢你的支持 :)

2 个回答

1

现代的硬件和驱动程序支持多路音频流。所以,除非你在用非常老旧的硬件或者质量很差的驱动,否则应该都能正常工作。

不过,ALSA(高级Linux声音架构)可能会给你更多的控制权,相比之下,OSS(开放声音系统)就没那么灵活。现在大多数操作系统内核都同时支持这两种。

8

简单来说,就是“把声音系统从OSS换成PulseAudio。”(或者设置ALSA使用dmix,或者换一块在Linux上驱动更好的声卡……)

复杂一点的说法是,你的代码其实已经能按照你想要的方式工作了……在某些声卡上。OSS驱动可以让硬件混音器工作,这样你就可以同时播放多个音频流,或者它们也可以只提供一个音频流,这样就会导致你在系统上看到的音频阻塞问题。这里唯一正确的解决办法就是使用一个可以确保软件混音的API。

撰写回答