【问题标题】:How can I play an mp3 with pygame?如何使用 pygame 播放 mp3?
【发布时间】:2011-12-06 11:19:09
【问题描述】:
import pygame
file = 'some.mp3'
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()

这会输出“进程以退出代码 0 完成”,但它不播放任何内容。我该如何解决这个问题?

【问题讨论】:

  • 你试过 pygame.mixer.music.play(loops=-1) ???
  • 是的,我尝试更改循环、设置音量、更改频道。程序运行但没有声音
  • while pygame.mixer.music.get_busy(): pygame.time.Clock().tick(10) 这样的事情解决了我的问题。我不知道为什么,但是音乐很忙。
  • 来自pygame.org/docs/ref/music.html “请注意,MP3 支持是有限的。[...] 考虑改用 OGG。”
  • 是的,但是当我尝试播放声音时发生了pygame.mixer.Sound(filename) Sound.play

标签: python pygame


【解决方案1】:

PyGame 有 2 个用于播放声音和音乐的不同模块,pygame.mixer 模块和 pygame.mixer.music 模块。该模块包含用于加载 Sound 对象和控制播放的类。文档中解释了差异:

音乐播放和常规声音播放之间的区别在于,音乐是流式传输的,并且不会一次真正加载。混音器系统一次只支持一个音乐流。

如果要播放mp3文件,需要初始化模块。使用pygame.mixer.music.load 加载文件。调用pygame.mixer.music.play() 开始播放音乐流。最后,您必须等待文件播放。
使用pygame.mixer.music.get_busy() 测试是否混合了声音。循环不断地查询混音器的状态。
在循环中,您需要将时间延迟pygame.time.delaypygame.time.Clock.tick。此外,您需要处理应用程序循环中的事件。分别见pygame.event.get()pygame.event.pump()

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

import pygame
pygame.init()

pygame.mixer.music.load('my_music.mp3')
pygame.mixer.music.play()

clock = pygame.time.Clock()
while pygame.mixer.music.get_busy():
    clock.tick(60)
    pygame.event.poll()

【讨论】:

    【解决方案2】:

    这是一个超级简单的方法。

    import pygame
    file = 'some.mp3'
    pygame.init()
    pygame.mixer.init()
    pygame.mixer.music.load(file)
    pygame.mixer.music.play()
    pygame.event.wait()
    

    【讨论】:

      【解决方案3】:

      试试这个。

      import pygame
      
      def pmusic(file):
          pygame.init()
          pygame.mixer.init()
          clock = pygame.time.Clock()
          pygame.mixer.music.load(file)
          pygame.mixer.music.play()
          while pygame.mixer.music.get_busy():
              print("Playing...")
              clock.tick(1000)
      
      def stopmusic():
          pygame.mixer.music.stop()
      
      
      def getmixerargs():
          pygame.mixer.init()
          freq, size, chan = pygame.mixer.get_init()
          return freq, size, chan
      
      
      def initMixer():
          BUFFER = 3072  # audio buffer size, number of samples since pygame 1.8.
          FREQ, SIZE, CHAN = getmixerargs()
          pygame.mixer.init(FREQ, SIZE, CHAN, BUFFER)
      
      try:
          initMixer()
          file = 'C:\\data\\03.mp3'
          pmusic(file)
      except KeyboardInterrupt:  # to stop playing, press "ctrl-c"
          stopmusic()
          print("\nPlay Stopped by user")
      except Exception:
          print("unknown error")
      
      print("Done")
      

      【讨论】:

      • 欢迎来到 StackOverflow。仅包含代码的答案往往会被标记为删除,因为它们是“低质量”的。请阅读有关回答问题的帮助部分,然后考虑在您的回答中添加一些评论。
      【解决方案4】:

      由于您导入的方式,音频似乎无法播放。下面的代码按预期播放声音。除了使用from pygame import mixer 而不是import pygame 之外,这里没有任何变化。这可能是因为 Pygame 是一个包,但我不确定。

      from pygame import mixer
      
      file = 'some.mp3'
      mixer.init()
      mixer.music.load(file)
      mixer.music.play()
      

      【讨论】:

        【解决方案5】:

        音乐停止是因为它是一个异步事件,这意味着它将继续与脚本一起播放。然后,脚本立即停止,不给音乐开始的机会。 如前所述,您可以使用

        while pygame.mixer.music.get_busy(): 
          pygame.time.Clock().tick(10)
        

        不过,pygame.event.wait() 更好,因为它会等待所有异步事件结束。

        【讨论】:

          【解决方案6】:

          我从thepythongamebook.com找到了一个很好的解决方案:

          pygame.mixer.pre_init(44100, -16, 2, 2048) # setup mixer to avoid sound lag
          
          pygame.init()
          
          pygame.mixer.init()
          
          pygame.mixer.music.load('music_01.mp3')
          
          pygame.mixer.music.play(-1)
          

          【讨论】:

            【解决方案7】:

            play 函数开始播放音乐,但立即返回。然后你的程序结束了,pygame 对象被自动销毁,导致音乐停止。

            正如您所评论的,如果您在退出前等待它,它会播放音乐 - 因为在 while 循环完成之前,pygame 对象不会被销毁。

            while pygame.mixer.music.get_busy(): 
                pygame.time.Clock().tick(10)
            

            【讨论】:

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