打开MP3触发UnicodeDecodeError,Pygame音频播放故障排查
解决MP3播放时的UnicodeDecodeError及无法播放问题
错误根源
- MP3是二进制文件,你用
mode='r'文本模式打开时,Python会尝试把二进制字节按系统默认编码解码成字符串,遇到无法识别的字节就抛出UnicodeDecodeError。 - 就算勉强读取成功,得到的也是乱码字符串(就是你看到的
\x00\x00...这类内容),mixer.music.load()根本无法识别这种错误格式的数据。
修复方案
直接获取MP3文件的路径传给mixer.music.load()即可,不需要读取文件内容。用askopenfilename代替askopenfile,因为前者直接返回文件路径字符串,更适合pygame加载音频。
修正后的代码:
from pygame import mixer from tkinter import Button, Checkbutton, IntVar, askopenfilename mixer.init() mp3button = Button(master, text="Choose MP3", highlightthickness=0, bd=0, bg='black', activebackground="black", fg="white", command=see_check) checkvar = IntVar() checkplay = Checkbutton(master, text="Play MP3?", variable=checkvar, onvalue=1, offvalue=0, font=('Arial',12), bg='blue', fg='white', activebackground='blue', activeforeground='white') def see_check(): if checkvar.get() == 1: file_path = askopenfilename(filetypes=[('MP3 Files', '*.mp3')]) if file_path: # 确认用户选择了文件 mixer.music.load(file_path) mixer.music.play()
备选方案(用二进制文件对象)
如果一定要通过文件对象加载,需用二进制模式打开文件:
def see_check(): if checkvar.get() == 1: file = askopenfile(mode='rb', filetypes=[('MP3 Files', '*.mp3')]) if file is not None: mixer.music.load(file) mixer.music.play()
内容的提问来源于stack exchange,提问作者Wawayayayayaya
相关产品推荐
相关产品推荐

