【问题标题】:pygame mixer: No available audio device or no sound when multiprocessingpygame混音器:多处理时没有可用的音频设备或没有声音
【发布时间】:2017-08-01 04:36:23
【问题描述】:

这是简化的示例。我有这个代码:

from pygame import mixer
def say():
    mixer.init()
    mixer.music.load('/home/orif/Downloads/english.wav')
    mixer.music.play()
    while mixer.music.get_busy():
        time.sleep(0.2)

它会显示一些警告,但运行良好。警告:

ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) 无法打开从站 ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open) 无法打开从属 ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) 未知 PCM 卡.pcm.rear ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) 未知 PCM cards.pcm.center_lfe ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) 未知 PCM 卡.pcm.side ALSA 库 pcm_dmix.c:1029:(snd_pcm_dmix_open) 无法打开从站

但是如果我在子进程中运行它就不会:

def test():
    talk_process = Process(target=say)
    talk_process.start()
    print 'waiting for the process...'
    talk_process.join()
    print 'done'

它会打印相同的警告,然后:

waiting for the process...
Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/home/orif/Projects/example.py", line 178, in say
    mixer.init()
error: No available audio device
done

如果我做同样的事情但使用线程,它运行良好。我已经尝试过herehere 所写的内容。在前一个链接中,cmets 中的解决方案几乎帮助了我。我在运行子进程之前初始化了混音器:

mixer.init()
talk_process.start()

但是现在声音不播放了,等待循环while mixer.music.get_busy()是没完没了

发生了什么以及如何解决?

【问题讨论】:

    标签: python-2.7 pygame python-multiprocessing


    【解决方案1】:

    好吧,我的错,我在提问之前没有检查所有内容。上面的代码 sn-p 有点不完整。还有一些我认为无关紧要的进口。我在使用 SpeechRecognition 的地方导入了我的模块。代码中有一个函数声明,如下所示:

    def foo(m = sr.Microphone()):
        pass
    

    在编写该代码的那一刻,我认为,由于 Python 会在最后一刻执行所有操作,因此它也应该可以工作。当我运行该代码时,它确实如此,所以一切似乎都很好。我错了。

    在函数声明的那一刻,该方法调用并未被视为“如果没有给出参数,则用此调用的结果替换”,而是实际调用了它,并将返回值用作可选参数。我不知道多处理时声卡到底出了什么问题,但这就是为什么我收到那些奇怪而晦涩的错误消息。

    这里有一个小例子来说明导致问题的原因:

    def foo():
        print 'TRIGGERED'
        return 42
    
    def bar(a = foo()):
        print a
    
    if __name__ == '__main__':
        pass
    

    虽然看起来它什么都不做,但这段代码实际上打印了 TRIGGERED。因此,我没有像这样为可选参数赋值,而是这样做:

    def foo(a = None):
        a = 'bar' if a is None else a
    

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多