声音文件在PyInstaller之后无法在PySide应用程序中播放



在我的 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')

相关内容

  • 没有找到相关文章

最新更新