Воспроизведение музыки с Pygame ненадежно - PullRequest
1 голос
/ 21 ноября 2011

Я пытаюсь написать простую программу для воспроизведения музыкальных файлов с помощью 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)

Но у меня есть некоторые загадочные проблемы.Сообщение "[File name] loaded!" всегда печатается, но иногда оно никогда не входит в цикл и сразу выходит.Если я проверяю состояние pygame.mixer.music.get_busy(), оно появляется как ложное сразу после команды pygame.mixer.music.play(1).Это происходит беспорядочно;Я просто попытался запустить программу без изменений в коде, заставить ее работать один раз и сразу после этого столкнуться с этой проблемой.Кто-нибудь знает, что может быть причиной этих, казалось бы, случайных проблем с воспроизведением?

1 Ответ

4 голосов
/ 07 декабря 2011

Я полагаю, это потому, что фактическое воспроизведение музыки происходит в другом потоке, поэтому иногда оно не заканчивается, начиная с того момента, когда вы в первый раз звоните get_busy().

Если это так, кажется,ошибка в pygame или SDL_mixer (которую использует pygame.)

В качестве альтернативного способа проверки завершения музыки, вы можете получить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...