【问题标题】:Pygame, sounds don't playPygame,声音不播放
【发布时间】:2011-02-25 14:04:29
【问题描述】:

我正在尝试使用 pygame 播放声音文件 (.wav),但是当我启动它时,我什么也没听到。
这是代码:

import pygame

pygame.init()
pygame.mixer.init()
sounda= pygame.mixer.Sound("desert_rustle.wav")

sounda.play()

我也尝试过使用渠道,但结果是一样的

【问题讨论】:

  • 可能对原始海报没有实际意义,但无论谁通过搜索找到此内容,请避免使用没有睡眠时间或固定睡眠时间的解决方案。看看我睡觉的答案,但只有在音乐/声音播放时。这就是你想要做的。

标签: python audio pygame


【解决方案1】:

对我来说(在 Windows 7、Python 2.7、PyGame 1.9 上)我实际上必须删除 pygame.init() 调用才能使其工作,或者如果 pygame.init() 保留至少在 pygame 中创建一个屏幕。

我的例子:

import time, sys
from pygame import mixer

# pygame.init()
mixer.init()

sound = mixer.Sound(sys.argv[1])
sound.play()

time.sleep(5)

【讨论】:

  • time.sleep(5) 是解决方案(就像 VagosLabrou 回答的那样)。
  • 哇,让 pygame.init() 离开为我解决了这个问题。难以置信!
  • 删除 pygame.init 对我来说也是如此
  • 您播放的声音是否正好是 5 秒长?正如我的回答一样,您应该有一个循环,以保持线程足够长以播放整个声音。
【解决方案2】:

sounda.play() 返回播放声音所必需的对象。有了它你还可以查明声音是否还在播放:

channela = sounda.play()
while channela.get_busy():
   pygame.time.delay(100)

【讨论】:

    【解决方案3】:

    播放mixer.Sound没有声音,但是创建窗口后它开始工作,这是一个最小的示例,只需更改文件名,运行并按UP键即可播放:

    WAVFILE = 'tom14.wav'
    import pygame
    from pygame import *
    import sys
    
    mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=4096)
    pygame.init()
    print pygame.mixer.get_init() 
    screen=pygame.display.set_mode((400,400),0,32) 
    
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:                                                    
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key==K_ESCAPE:
                     pygame.quit()
                     sys.exit()
                elif event.key==K_UP:
                    s = pygame.mixer.Sound(WAVFILE)
                    ch = s.play()
                    while ch.get_busy():
                        pygame.time.delay(100)
        pygame.display.update()
    

    【讨论】:

      【解决方案4】:

      你需要做的是这样的:

       import pygame
       import time
      
       pygame.init()
       pygame.mixer.init()
       sounda= pygame.mixer.Sound("desert_rustle.wav")
      
       sounda.play()
       time.sleep (20)
      

      我告诉程序休眠的原因是因为我想要一种方法来保持它运行而无需输入大量代码。我有同样的问题,声音没有播放,因为程序在尝试播放音乐后立即关闭。

      如果您希望程序实际执行某些操作,只需键入所有必要的代码,但要确保它能够持续足够长的时间以使声音完全播放。

      【讨论】:

      • 如果声音只有 2 秒,是否要让程序空闲 20 秒?请检查我的答案。
      【解决方案5】:
      import pygame, time
      
      
      pygame.mixer.init()
      pygame.init()
      
      sounda= pygame.mixer.Sound("beep.wav")
      
      sounda.play()
      

      pygame.init()mixer.init() 之后。它对我有用。

      【讨论】:

        【解决方案6】:

        我在 Windows 7 下遇到了同样的问题。在我的情况下,我没有以管理员身份运行代码。不要问我为什么,但以管理员身份打开命令行为我解决了它。

        【讨论】:

        • 试过了,没用。我仍然认为这是一个 Windows 问题。
        【解决方案7】:

        我认为你需要的是 pygame.mixer.music:

        import pygame.mixer
        from time import sleep
        pygame.mixer.init()
        pygame.mixer.music.load(open("\windows\media\chimes.wav","rb"))
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy():
            sleep(1)
        print "done"
        

        【讨论】:

          【解决方案8】:

          您的代码在我的机器(Mac OSX 10.5、Python 2.6.4、pygame 1.9.1)上播放 desert_rustle.wav 非常好。您使用的是什么操作系统、Python 和 pygame 版本?您能否通过其他方式听到.wav OK(例如,Mac 终端上的open 或Windows 控制台上的start,后跟.wav 文件的文件名/路径)以保证文件没有损坏?如果无法重现它并且没有所有这些关键细节,就很难调试您的特定问题(与您提供的代码无关)。

          【讨论】:

            【解决方案9】:

            试试吧:

            import pygame.mixer
            from time import sleep
            pygame.mixer.init()
            pygame.mixer.music.load(open("\windows\media\chimes.wav","rb"))
            print ""
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():
                sleep(1)
            print "done"
            

            这应该可行。你只需要添加print "",声音就会有 有时间加载它自己。

            【讨论】:

              【解决方案10】:

              您错过了等待声音结束的时间。您的应用程序将开始播放声音,但会立即退出。

              如果你想播放单个 wav 文件,你必须初始化模块并从文件中创建一个pygame.mixer.Sound() 对象。调用play() 开始播放文件。最后,您必须等待文件播放。

              使用get_length() 获取声音的长度(以秒为单位)并等待声音结束: (pygame.time.wait() 的参数以毫秒为单位)

              import pygame
              
              pygame.mixer.init()
              sounda = pygame.mixer.Sound('desert_rustle.wav')
              sounda.play()
              pygame.time.wait(int(sounda.get_length() * 1000))
              

              或者,您可以使用pygame.mixer.get_busy 来测试是否混合了声音。循环不断地查询混音器的状态。
              在循环中,您需要将时间延迟pygame.time.delaypygame.time.Clock.tick。此外,您需要处理应用程序循环中的事件。分别见pygame.event.get()pygame.event.pump()

              对于游戏的每一帧,您都需要对事件队列进行某种调用。这可确保您的程序可以在内部与操作系统的其余部分进行交互。

              import pygame
              pygame.init()
              
              pygame.mixer.init()
              sounda = pygame.mixer.Sound('desert_rustle.wav')
              sounda.play()
              
              while pygame.mixer.get_busy():
                  pygame.time.delay(10)
                  pygame.event.poll()
              

              【讨论】:

                【解决方案11】:

                只需尝试重新保存您的 wav 文件以确保其频率信息。或者你可以录制一个声音来确定它的频率、比特、大小和通道。(我用这个方法来解决这个问题)

                【讨论】:

                  【解决方案12】:

                  我遇到过这样的事情。也许你有同样的问题?尝试使用绝对路径:

                  import pygame
                  
                  pygame.init()
                  pygame.mixer.init()
                  sounda= pygame.mixer.Sound("/absolute_path/desert_rustle.wav")
                  
                  sounda.play()
                  

                  其中 abslute_path 显然被您的实际绝对路径替换;)

                  祝你好运。

                  【讨论】:

                    【解决方案13】:
                    import pygame
                    
                    pygame.init()
                    sound = pygame.mixer.Sound("desert_rustle.wav")
                    pygame.mixer.Sound.play(sound)
                    

                    这将适用于 python 3

                    【讨论】:

                      【解决方案14】:

                      迟到了 5 年的答案,但我希望我能帮助别人.. :-)

                      首先,您不需要“pygame.init()”行。 其次,循环播放其中的声音,否则 pygame.mixer 将启动,并立即停止播放。

                      我让这段代码在我的 Raspberry pi 和 Raspbian OS 上正常工作。 请注意,我使用了一个持续循环声音的 while 循环。

                      import pygame.mixer
                      
                      pygame.mixer.init()
                      sounda = pygame.mixer.Sound("desert_rustle.wav")
                      
                      while True:
                          sounda.play()
                      

                      【讨论】:

                      • “while True:”循环创建多个声音播放实例。它不等于播放一次声音或歌曲。它将最大限度地提高您的输出增益并显着降低您播放的声音的质量。使用线程播放声音并让声音播放/停止以响应事件。
                      【解决方案15】:

                      这样做:

                      import pygame
                      
                      pygame.mixer.init()
                      pygame.mixer.music.load("desert_rustle.wav")
                      pygame.mixer.music.play(0)
                      

                      我认为您的问题是该文件是 WAV 文件。 它适用于我的 MP3。这可能适用于 python 3.6。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多