如何在Python中播放声音而不打断音乐或其他声音
我正在用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。