在pygame中(或者甚至在python中),如何在声音播放时创建一个继续执行的循环?

时间:2012-07-27 15:57:04

标签: python pygame audio

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

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

  1. 播放声音
  2. 正在播放的声音继续循环播放
  3. 当声音播放完毕后,继续前进。
  4. 我确实检查了其他问题 - 没有找到任何专门针对python / pygame的内容。

    谢谢!

4 个答案:

答案 0 :(得分:6)

诀窍在于,当您调用声音的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'的声音文件。

答案 1 :(得分: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理解的任何文件类型。

答案 2 :(得分:0)

要使用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"
            ...

答案 3 :(得分: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则为。错误意味着它已经完成。