如何遍历歌曲列表并一个接一个地播放

Posted

技术标签:

【中文标题】如何遍历歌曲列表并一个接一个地播放【英文标题】:How can I Iterate through a list of songs and play them one after eachother 【发布时间】:2022-01-24 04:45:30 【问题描述】:

我希望遍历诸如Songs = ["Song1.mp3", "Song2.mp3", "Song3.mp3"] 之类的歌曲列表,并且我想一个接一个地播放每首歌曲。

我尝试了各种方法,建议最多的似乎是使用 pygame,但是,我无法调试使用它带来的大量错误。我的主要源代码和尝试如下所示:

from tkinter import *
import pygame
from random import choice
import os

pygame.mixer.init()

Songs = os.listdir("Music\\")

def Play():
       Song = choice(Songs)
       pygame.mixer.music.load("Music\\" + Song)
       pygame.mixer.music.play()

while True:
    play()

运行时我收到错误pygame.error: ModPlug_Load failed

我在我拥有的幻灯片程序中同时运行它,我希望这段代码作为背景音乐运行,我计划在我已经设置的函数中检查歌曲的结尾。

【问题讨论】:

***.com/questions/45909266/… 【参考方案1】:

使用pygame.mixer.music.get_busy() 检测音乐流是否正在播放。当没有流处于活动状态时,播放列表中的下一首歌曲。例如:

import pygame

play_list = ["song1.mp3", "song2.mp3", "song3.mp3"]
current_list = []

pygame.init()
clock = pygame.time.Clock()

run = True
while run:
    clock.tick(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    
    if not pygame.mixer.music.get_busy():
        if not current_list:
           current_list = play_list[:]
        current_song = current_list.pop(0)
        pygame.mixer.music.load(current_song)
        pygame.mixer.music.play()

pygame.quit()
exit()

【讨论】:

感谢您的回复,我将尝试解决此问题,因为它会引发一些我将尝试处理的错误。会及时通知您 @ShamusWood 我的代码中有一个错误current_list[:] 必须是current_list = play_list[:]。 (答案已更新)【参考方案2】:

您可以使用pygame.mixer.music.set_endevent()注册一个自定义事件,该事件将在音乐播放完毕时触发。

如果您想与主应用程序同时运行,您还需要在子线程中运行 while 循环。

下面是一个例子:

import os
import random
import threading
import tkinter as tk
import pygame

pygame.init()
# create a custom event
MUSIC_DONE = pygame.event.custom_type()
# register the event
pygame.mixer.music.set_endevent(MUSIC_DONE)

folder = "Music\\"
Songs = os.listdir(folder)

def next_song():
    try:
        song = random.choice(Songs)
        pygame.mixer.music.load(os.path.join(folder, song))
        pygame.mixer.music.play()
        # update song name
        song_var.set(song)
    except Exception as e:
        print(e)

def pygame_loop():
    next_song()
    while pygame.get_init():
        for event in pygame.event.get():
            if event.type == MUSIC_DONE:
                # current song done playing, play next song
                next_song()

root = tk.Tk()

# label to show the current song being played
song_var = tk.StringVar()
tk.Label(root, textvariable=song_var).pack()

# start the pygame loop in a child thread
threading.Thread(target=pygame_loop).start()

root.mainloop()
# quit pygame
pygame.quit()

【讨论】:

感谢您的回复,执行此代码后我仍然收到相同的错误pygame.error: ModPlug_Load failed。我将重新下载 MP3 文件,因为 pygame 读取文件的方式似乎存在一些问题。 我已经测试了几个 MP3 文件,但无法重现该问题。【参考方案3】:

如果它是桌面应用程序,您有多个播放文件的选项,通常,这取决于:

另外为了避免Tkinter被卡住,你需要使用线程或者多进程。我推荐你的声音文件播放器,你会在这里找到例子https://realpython.com/playing-and-recording-sound-python/

【讨论】:

以上是关于如何遍历歌曲列表并一个接一个地播放的主要内容,如果未能解决你的问题,请参考以下文章

核心数据,如何从关系集合中删除一个元素(NSSet)

选择排序算法

在 VideoView 中一个接一个地播放视频

如何统一播放音频

如何在 AVAudioplayer 中播放多个文件

Web:如何无延迟地一个接一个地播放音频文件?