You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:20:18