如何测试 mp3 文件是否已播放完毕,以便我可以播放下一个?

问题描述 投票:0回答:1

我正在尝试创建一个快速的小 GUI,它可以让我播放 mp3 文件、暂停它们、跳到序列中的下一个文件,最重要的是:在最后一个 mp3 文件播放完毕后播放下一个 mp3 文件。

然而,最后一个规定是一个问题,无论我如何尝试,我都无法使其发挥作用。我正在考虑将所有 mp3 文件附加到一个文件中,然后跳过该文件,但如果可以的话,我想这样解决它。

我的问题是:如何测试 mp3 文件是否已播放完毕,以便我可以播放下一个?

这是我的代码:

from pygame import mixer 
import os,sys
import tkinter as tk
from tkinter import PhotoImage

#getting song list
song_list = [];
for root, dirs, files in os.walk("/Users/loganjacobs/Desktop/mp3playerFiles"):
  for name in files:
    song_list.append(os.path.join(root, name))


# Starting the mixer 
mixer.init() 

# Loading the song 
song_count = 0;
mixer.music.load(song_list[song_count]) 

# Setting the volume 
mixer.music.set_volume(0.5) 

# Start playing the song 
mixer.music.play()

paused = False

def pause():
    mixer.music.pause()
    
def resume():
    mixer.music.unpause()
    
def stop():
    mixer.music.stop()

def skip(song_count):
    song_count = (song_count + 1) % len(song_list)
    mixer.music.load(song_list[song_count])
    mixer.music.play()
    return song_count

window = tk.Tk()
frame = tk.Frame()

def button_pause():
    global paused
    paused = not paused
    pause() if paused else resume()
    pause_button.config(image= play_image if paused else pause_image)

pause_image = PhotoImage(file='imgs/pause_button.png').subsample(4)
play_image = PhotoImage(file='imgs/play_button.png').subsample(4)
pause_button = tk.Button(frame,image=pause_image,command= lambda: button_pause())
pause_button.pack()

def button_skip():
    global song_count
    global paused
    if paused:
        button_pause()
    song_count = skip(song_count)

skip_image = PhotoImage(file='imgs/skip_button.png').subsample(4)
skip_button = tk.Button(frame,image= skip_image,command= lambda: button_skip())
skip_button.pack()

frame.pack()

window.mainloop()


我尝试使用window.after不断测试mixer.music.get_busy()是否为True,但这似乎不起作用。我尝试使用mixer.music.get_pos(),但这导致了口吃。我也尝试使用 pygame 事件,但我真的不知道如何使用它们,所以我让 chatGPT 尝试一下,但这也不起作用。有任何想法吗?我非常感激。

python tkinter mp3 pygame-mixer
1个回答
0
投票

使用mixer.music.get_busy()或mixer.music.get_pos()来确定歌曲是否已完成播放的问题是它们不提供实时反馈,并且对于您的情况可能不准确。 相反,您可以利用 Pygame 的 music_end 操作来确定歌曲何时完成播放。

© www.soinside.com 2019 - 2024. All rights reserved.