【问题标题】:How to play sound in Python WITHOUT interrupting music/other sounds from playing如何在 Python 中播放声音而不中断音乐/其他声音的播放
【发布时间】:2011-01-08 16:38:18
【问题描述】:

我正在用 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 来确保软件混合,请提出一种方法:)

感谢支持 :)

【问题讨论】:

  • 没有现代音响系统一次只能处理一个流。

标签: python linux audio timer


【解决方案1】:

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

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

【讨论】:

  • 感谢您提供信息。我想这个问题会通过添加“如果解决方案需要一个确保软件混合的 API,它应该是什么?”来扩大。干杯
  • 这就是我推荐 PulseAudio 的原因。默认情况下,pulseaudio 守护进程会为您处理软件混音。
  • 对,我应该把你的回复读两遍。我会看看 PulseAudio。谢谢
【解决方案2】:

现代硬件和驱动程序支持多个流。因此,除非您使用的是旧硬件或蹩脚的驱动程序,否则它应该可以正常工作。

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

【讨论】:

  • 我一定会试试 Alsa。我刚刚验证,这是我的声卡使用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
相关资源
最近更新 更多