Python语音机器人playsound循环播MP3报MCI Error 263如何解决?
错误原因
- 核心是Windows系统下
playsound库的底层实现缺陷:播放音频完成后不会及时释放文件句柄,也没有正确释放MCI设备资源。 - 你在循环内反复覆盖同一个
Welcome.mp3文件,前两次播放后文件还被系统占用,第三次要写入新内容或者打开播放时,系统无法访问被占用的文件,就抛出263错误。
修复方案
下面给两个可行的修复方式,按需选择即可:
方案1:每次使用不同的临时音频文件,播放后直接删除
不需要更换依赖库,修改循环内的音频生成播放逻辑就行,修改后的代码片段如下:
import uuid # 新增导入,用来生成唯一文件名 # 前面的原有代码保持不变,只修改for循环内的逻辑 for i in r.json(): bot_message = i['text'] print(f"{i['text']}") myobj = gTTS(text=bot_message) # 生成唯一临时文件名,避免重复占用 temp_filename = f"temp_{uuid.uuid4().hex}.mp3" myobj.save(temp_filename) playsound(temp_filename) # 播放完成后删除临时文件 os.remove(temp_filename)
这个方案改动最小,兼容性最好,适合不想调整依赖的场景。
方案2:更换更稳定的音频播放库
playsound本身年久失修,Windows下bug很多,可以换成pygame的音频模块来播放,稳定性更高:
- 先安装依赖:
pip install pygame - 修改后的播放逻辑示例:
from pygame import mixer # 新增导入 # 初始化mixer mixer.init() # 原有代码不变,循环内播放部分改成下面的逻辑 for i in r.json(): bot_message = i['text'] print(f"{i['text']}") myobj = gTTS(text=bot_message) myobj.save("Welcome.mp3") # 用pygame播放 mixer.music.load("Welcome.mp3") mixer.music.play() # 等待播放完成 while mixer.music.get_busy(): pass # 卸载文件,释放资源 mixer.music.unload()
内容的提问来源于stack exchange,提问作者Pankaj Jaiswal
相关产品推荐
相关产品推荐

