在我的 PySide 应用程序中,我使用以下代码来播放 wav 文件:
media = Phonon.MediaObject()
audio = Phonon.AudioOutput(Phonon.MusicCategory)
Phonon.createPath(media, audio)
alarm_file = 'alarm_beep.wav'
f = QtCore.QFile(alarm_file)
if f.exists():
source = Phonon.MediaSource(alarm_file)
if source.type() != -1: # -1 stands for invalid file
media.setCurrentSource(source)
media.play()
else:
logger.debug('Alert media missing: %s' % alarm_file)
当我运行 Python 脚本时,这在 Ubuntu 中工作正常,但是当我使用 Windows 版 Pyinstaller 将应用程序编译为 exe 时,声音无法播放。
我使用以下 pyinstaller 命令
pyinstaller --onefile --add-data "alarm_beep.wav;." main.py
尝试添加媒体文件,但无济于事。
控制台中的异常是
WARNING: bool __cdecl Phonon::FactoryPrivate::createBackend(void) phonon backend plugin could not be loaded
WARNING: bool __cdecl Phonon::FactoryPrivate::createBackend(void) phonon backend plugin could not be loaded
WARNING: bool __cdecl Phonon::FactoryPrivate::createBackend(void) phonon backend plugin could not be loaded
WARNING: bool __cdecl Phonon::FactoryPrivate::createBackend(void) phonon backend plugin could not be loaded
WARNING: Phonon::createPath: Cannot connect MediaObject ( no objectName ) to AudioOutput ( no objectName ).
Alert media missing: alarm_beep.wav
所以很明显,就好像"alarm_beep.wav"不存在一样。
不确定为什么add-data
命令没有处理它?
捆绑应用程序
后,外部文件将保存在您需要引用的临时目录中。有关引用这些外部文件的讨论,请参阅这篇文章。简而言之,在引用资源文件之前,您需要更新其路径:
#resource_path is the relative path to the resource file, which changes when built for an executable
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath('.')
return os.path.join(base_path, relative_path)
并在代码正文中:
alarm_file = resource_path('alarm_beep.wav')