使用Pygame播放音乐不可靠

1 投票
1 回答
1977 浏览
提问于 2025-04-17 06:43

我正在尝试写一个简单的程序,用Pygame来播放音乐文件。我的代码如下。

import pygame

import sys
import time

FRAMERATE = 30

if len(sys.argv) < 2:
   sys.exit(2)

filename = sys.argv[1]

clock = pygame.time.Clock()

pygame.init()

pygame.mixer.init(frequency=44100)
pygame.mixer.music.load(filename)
print "%s loaded!" % filename
pygame.mixer.music.play(1)

while pygame.mixer.music.get_busy():
   clock.tick(FRAMERATE)

但是我遇到了一些让人困惑的问题。每次都会打印出"[文件名]已加载!"的消息,但有时候程序根本没有进入循环,直接就退出了。如果我检查一下pygame.mixer.music.get_busy()的状态,发现它在执行pygame.mixer.music.play(1)命令后立刻显示为假。这种情况时好时坏;我刚刚运行了程序,没有对代码做任何修改,有一次它正常工作,接着又遇到了这个问题。有没有人知道是什么原因导致这些看起来随机的播放问题?

1 个回答

4

我想这可能是因为音乐播放是在另一个线程中进行的,所以当你第一次调用 get_busy() 时,有时候它还没开始播放。

如果真是这样的话,那就像是pygame或者它使用的SDL_mixer里有个小问题。

作为检查音乐是否播放完的另一种方法,你可以让pygame在音乐结束时给你发个事件,然后你就可以检查这个事件。可以这样做:

pygame.mixer.music.set_endevent(pygame.USEREVENT)

quit = False
while not quit:
   clock.tick(FRAMERATE)
   for event in pygame.event.get():
      if event.type == pygame.QUIT: 
        quit = True
      if event.type == pygame.USEREVENT: 
        print "Music ended"
        quit = True

撰写回答