原本使用pygame循环播放mp3好好的。结果用了pyinstaller之后,非常奇怪的是,在调用pygame.mixer.music.load(path)时就会报错,报pygame.error,如下图。经过检查,path并不含中文;通过print(path)确定过path没错;而且如果直接用os.system(path)就可以播放。
一顿百度、Google后也找不到解决办法,只能换库,于是对比之下找到了simpleaudio这个库(不推荐playsound;pydub用的播放引擎也是simpleaudio):https://simpleaudio.readthedocs.io/en/latest/#simple-example
这次配合pyinstaller使用完全正常~ 缺点是如果用了wait_done(),则播放时会阻塞住,可以通过在子线程中循环播放解决;另外mp3文件需要转成wav格式。代码如下:
import sys
import os
import simpleaudio as sa
# 使用pyinstaller打包资源后,运行时资源会释放到/Temp/_MEI******目录下,其真实路径需要借助sys._MEIPASS获取:https://www.cnblogs.com/darcymei/p/9397173.html
def resource_path(relative_path):
if getattr(sys, 'frozen', False): # 是否Bundle Resource
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
# 循环播放WAV文件
def playMusic():
wave_obj = sa.WaveObject.from_wave_file(resource_path("alert.wav"))
while True:
play_obj = wave_obj.play()
play_obj.wait_done()
附:python播放音频方式汇总:https://blog.csdn.net/zzc15806/article/details/80508463
网友评论