You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何使用Pygame播放音频时需添加time.sleep避免程序直接退出?

为什么使用Pygame播放MP3时必须添加time.sleep才能正常播放?

我正在尝试用Python播放MP3文件,接触到了Pygame。我成功实现了音乐播放,但发现必须添加time.sleep(SECONDS)才能正常播放,否则在终端运行时程序会直接退出。请问这是什么原因,还是我的操作有误?
代码如下:

import pygame, time
from pygame.locals import *
pygame.mixer.pre_init(44100, 16, 2, 4096)
pygame.init()
pygame.mixer.music.load("path/to/mp3/file")
pygame.mixer.music.play()
time.sleep(32)

注:我并非要制作游戏,如前所述,只是在尝试Python的相关功能。

你完全没有操作错误,这是Pygame音频播放的异步特性导致的正常现象:

当你调用pygame.mixer.music.play()时,Pygame会在后台启动一个独立线程来处理音频播放,而你的主线程会立刻继续执行后续代码。如果没有time.sleep()或者其他让主线程保持运行的逻辑,主线程执行完所有代码后就会直接退出,此时后台的音频播放线程也会被强制终止,自然听不到任何声音。

time.sleep(32)的作用就是让主线程暂停32秒,这段时间内程序保持运行状态,后台音频线程就能正常播放音乐。不过这种方式有个明显缺点——你得提前知道音乐的时长,不然要么没播完就停,要么空等浪费时间。

针对你的非游戏场景需求,我推荐两种更灵活的替代方案:

方案1:等待音乐自然播放完毕

利用pygame.mixer.music.get_busy()方法循环检查音频是否还在播放,直到播放结束再退出程序,不用硬编码等待时间:

import pygame

pygame.mixer.pre_init(44100, 16, 2, 4096)
pygame.init()
pygame.mixer.music.load("path/to/mp3/file")
pygame.mixer.music.play()

# 循环检查,直到音乐播放结束
while pygame.mixer.music.get_busy():
    pygame.time.Clock().tick(10)  # 每秒检查10次,避免占用过多CPU资源

方案2:使用更轻量的音频库

既然你不是做游戏,Pygame其实有点“大材小用”了。可以试试playsound这个专门用于播放音频的轻量库,代码更简洁,而且是同步播放(播放完成后才会继续执行后续代码):

# 先通过pip安装:pip install playsound
from playsound import playsound

playsound("path/to/mp3/file")

内容的提问来源于stack exchange,提问作者Tsuna

火山引擎 最新活动