部署时不使用 QSoundEffect 播放声音

Posted

技术标签:

【中文标题】部署时不使用 QSoundEffect 播放声音【英文标题】:Sound not playing with QSoundEffect when deployed 【发布时间】:2014-06-12 19:27:00 【问题描述】:

我遇到了一个很难调试的问题。我的程序需要不时播放声音(通常一次重叠多个声音文件)。我主要在 mac 上开发,mac 构建工作正常(使用 Qt 附带的 macdeployqt 实用程序打包),但是 windows 构建只会在编译它的机器上播放声音。我把它送去测试的每个人都没有得到任何声音(尽管我已经确认它可以正确找到声音文件,所以肯定不是这样)。

在启动时(从主窗口构造函数调用)我像这样加载每个文件:

QSoundEffect *tmpSfx = new QSoundEffect();
QUrl pathAsURL;
pathAsURL = pathAsURL.fromLocalFile(fileList.at(i).absoluteFilePath());
if (tmpSfx)

    qDebug() << "path" << pathAsURL;
    tmpSfx->setSource(pathAsURL);
    tmpSfx->setLoopCount(1);
    tmpSfx->setVolume(0.4);
 // tmpSfx->play();
    qDebug() << "is loaded" << tmpSfx->isLoaded();
    SoundsList.append(tmpSfx)

SoundsList 是QList&lt;QSoundEffect *&gt;

然后当我需要播放声音时,我调用:

SoundsList.at(SoundIndex)->play();

在 Windows 上,我将应用程序作为 zip 文件分发,其中包含所有必需的 Qt DLL。至少,我认为的所有 Qt DLL 都是必需的。

Qt5Core.dll
Qt5Gui.dll
Qt5Multimedia.dll
Qt5Network.dll
Qt5Widgets.dll
icudt52.dll
icuin52.dll
icuuc52.dll
libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll
platforms\qwindows.dll

我错过了什么明显的东西吗?

在我用来构建它的机器上运行时,它运行良好。当在同一个文件夹中没有 DLL 的同一台机器上运行时,它会失败,除非我从 Qt Creator 运行它,这就是我计算对大多数这些 DLL 的依赖关系的方法。当它在任何其他 Windows 机器上运行时,它运行得很好,没有错误,而且没有声音输出。

它使用 Qt 5.2 编写,使用 Creator 和 MinGW 构建。

【问题讨论】:

很可能与缺少 DLL 有关。我以前从未使用过它,但您可以尝试将 audio/qtaudio_windows.dll 包含在您的可执行文件夹中吗? (存在于Qt的plugins目录中) 【参考方案1】:

您很可能缺少位于 plugins\audio\qtaudio_windows.dll 中的 qtaudio_windows.dll。部署后,它应该位于名为“audio”的子文件夹中的应用程序目录中。

【讨论】:

【参考方案2】:

问题很可能出在您处理文件的方式上。您可以在设置 pathAsURL 后打印它的值,以查看它的设置,但这样处理文件通常是一个坏习惯,因为文件的路径很可能是硬编码到您计算机上的位置.而是将程序中使用的文件作为资源导入。

【讨论】:

以上是关于部署时不使用 QSoundEffect 播放声音的主要内容,如果未能解决你的问题,请参考以下文章

通知自定义声音在前台播放,但在后台应用程序时不播放

手机进入睡眠状态时不播放自定义通知声音

解决:win10有提示音,但是播视频没有声音

带有 Javascript 功能的引导轮播播放和暂停

在纯 WinAPI 中从内存缓冲区播放声音

Qt 播放音频文件的几种方式