小能豆

循环遍历包含声音文件路径的列表

py

因此,我计划循环遍历包含声音文件路径的列表,并使用 Python 中的 pygame.mixer 模块播放它们,但当我这样做时,我遇到的问题是 pygame 总是播放列表中最后一个索引路径文件,其余文件被跳过。例如,如果我的列表包含 2 个项目:

music_list = ['abc.mp3', 'gef.mp3']
for music_index in range(len(music_list)):
    mixer.init()
    mixer.music.load(music_list[music_index])
    mixer.music.play()

then it never plays abc.mp3 file and directly plays the last file gef.mp3

阅读 34

收藏
2024-10-10

共1个答案

小能豆

你遇到的问题是因为在循环中,你在每次迭代时都重新初始化了 pygame.mixer,这导致前一个音乐文件没有机会播放完就被下一个文件覆盖。

要按顺序播放每个音频文件,你需要在循环开始之前初始化混音器,并确保在加载下一个音乐文件之前等待当前音乐文件播放完毕。下面是一个修改后的示例代码:

import pygame
import time

# 初始化 Pygame 混音器
pygame.mixer.init()

music_list = ['abc.mp3', 'gef.mp3']

for music_file in music_list:
    # 加载音乐文件
    pygame.mixer.music.load(music_file)
    # 播放音乐文件
    pygame.mixer.music.play()

    # 等待当前音乐播放完毕
    while pygame.mixer.music.get_busy(): 
        time.sleep(1)  # 暂停一段时间以避免忙等待

# 所有曲目播放完毕后退出混音器
pygame.mixer.quit()

说明:

  1. 初始化: 在循环之前初始化混音器,这样只需初始化一次。
  2. 加载和播放: 在循环中,加载并播放每个音乐文件。
  3. 等待完成: while pygame.mixer.music.get_busy() 循环会检查当前音乐是否正在播放,如果是,程序将保持在此状态,直到音乐播放完毕。time.sleep(1) 用于减少 CPU 使用率,避免忙等待。
  4. 清理: 在所有曲目播放完毕后,退出混音器。

这样,每个音频文件都会完整播放,然后再移动到列表中的下一个文件。

2024-10-10