4

在 pygame 中有没有办法判断声音是否已经播放完毕?我阅读了set_endevent文档get_endevent,但我无法理解它或找到一个例子。

我正在尝试专门执行以下操作:

  1. 播放声音
  2. 在播放声音时,继续循环迭代
  3. 声音播放完毕后,继续前进。

我确实检查了其他被问到的问题——没有找到任何专门针对 python / pygame 的问题。

谢谢!

4

4 回答 4

9

诀窍是,pygame.mixer.Channel当您调用play()声音 ( pygame.mixer.Sound) 的方法时,您会得到一个类型的对象。您可以使用通道的方法测试声音是否播放完毕get_busy()

一个简单的例子:

import pygame.mixer, pygame.time

mixer = pygame.mixer

mixer.init()
tada = mixer.Sound('tada.wav')
channel = tada.play()

while channel.get_busy():
    pygame.time.wait(100)  # ms
    print "Playing..."
print "Finished."

这些示例假设您有一个名为“tada.wav”的声音文件。

于 2014-10-10T07:36:05.383 回答
5

您可以使用如下代码:

import pygame
pygame.mixer.music.load('your_sound_file.mid')
pygame.mixer.music.play(-1, 0.0)
while pygame.mixer.music.get_busy() == True:
    continue

而且,它不必是 .mid 文件。它可以是 pygame 可以理解的任何文件类型。

于 2012-07-27T16:18:34.320 回答
2

要使用set_endevent,您必须执行以下操作:

# You can have several User Events, so make a separate Id for each one
END_MUSIC_EVENT = pygame.USEREVENT + 0    # ID for music Event

pygame.mixer.music.set_endevent(END_MUSIC_EVENT)

running = True

# Main loop
while running:
    events = pygame.event.get()
    if events:
        for event in events:
            ...
            if event.type == END_MUSIC_EVENT and event.code == 0:
                print "Music ended"
            ...
于 2012-07-27T18:00:51.653 回答
0
pygame.mixer.pre_init(44100, 16, 2, 4096) # setup mixer to avoid sound lag
pygame.init()
startmusic="resources\snd\SGOpeningtheme.ogg"
pygame.mixer.set_num_channels(64) # set a large number of channels so all the game sounds will play WITHOUT stopping another
pygame.mixer.music.load(startmusic)
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1) # the music will loop endlessly

执行上述代码后,音乐将继续播放,直到您根据 pygame 站点信息停止或淡出为止。您可以循环播放您的心声,音乐将继续。如果您需要音乐播放两次,而不是 -1 放 1。然后音乐将播放一次并重复一次。您可以通过执行来检查流是否正在播放pygame.mixer.music.get_busy()。如果它返回 True 它是。False 表示它已经完成。

于 2014-09-19T06:54:33.677 回答