如何在后台播放循环pygame.mixer播放列表?

时间:2017-12-04 17:09:31

标签: python audio pygame

我有一个.ogg音乐文件的播放列表,我想在大型播放列表循环中设置它们在游戏背景中播放。因此,一旦所有音乐文件都由pygame.mixer播放,它就会循环回到开头重新开始。

但是,当我加载第一首曲目时,将其设置为播放,然后将其他曲目添加到队列中,只播放第一首曲目。我不知道如何让队列循环。我做错了什么?

playlist = ["2.ogg", "3.ogg", "1.ogg"]
pygame.mixer.init(frequency = 48000)
pygame.mixer.music.load("1.ogg")
pygame.mixer.music.play()
for track in playlist:
    pygame.mixer.music.queue(track)

1 个答案:

答案 0 :(得分:0)

我尝试使用queue(),但它对我不起作用 也许它需要for event循环才能工作,但它对我也没有用。

在下面的文档queue()中,我发现了这条评论:

  

此方法仅排队一个音乐文件   如果您调用它并且已经有一个排队的文件,它将被覆盖。

所以队列不是那么有用。

我使用pygame.mixer.music.set_endevent()for event循环来启动下一首曲目

import pygame

# define own event type
NEXT = pygame.USEREVENT + 1

playlist = [
    'track_one.ogg',
    'track_two.ogg',
    'track_three.ogg',
    'track_four.ogg',
]

tracks_number = len(playlist)
current_track = 0

pygame.init() # need it for event loop
#screen = pygame.display.set_mode((800,600)) # it can be useful to stop program 

pygame.mixer.init(frequency = 48000)

# start first track
pygame.mixer.music.load(playlist[current_track])
pygame.mixer.music.play()

# send event NEXT every time tracks ends
pygame.mixer.music.set_endevent(NEXT) 

running = True
while running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        elif event.type == NEXT:

            # get next track (modulo number of tracks)
            current_track = (current_track + 1) % tracks_number

            print("Play:", playlist[current_track])

            pygame.mixer.music.load(playlist[current_track])
            pygame.mixer.music.play()


pygame.quit()
相关问题