python循环播放音乐新方法(针对pyinstaller打包后

2020-06-09  本文已影响0人  RedB

原本使用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

上一篇 下一篇

猜你喜欢

热点阅读