如何在Python中播放声音而不会中断播放中的音乐/其他声音

时间:2010-01-24 01:40:38

标签: python linux audio timer

我正在使用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 个答案:

答案 0 :(得分:8)

简单的答案是“从OSS切换到PulseAudio”。 (或者设置ALSA使用dmix,或者使用更好的Linux驱动程序获得声卡......)

更复杂的答案是,您的代码已经按照您希望的方式在某些声卡上运行。 OSS驱动程序可以暴露硬件混音器,以便您可以同时播放多个音频流,或者它们可以显示单个流,从而导致您在系统上看到阻塞音频。这里唯一正确的解决方案是使用确保软件混合的API。

答案 1 :(得分:1)

现代硬件和驱动程序支持多个流。因此,除非你使用古老的硬件或蹩脚的驱动程序运行,否则无论如何都应该有效。

话虽如此,ALSA可能会给你比OSS更多的控制权。现在发布的大多数内核都支持这两种内核。