我想知道在Qt中有一种简单的方法可以在不阻塞主线程的情况下播放声音吗?
我知道,我应该开始一个单独的线程来做到这一点。但也许有捷径? :)
感谢您的帮助。
答案 0 :(得分:10)
标准QSound和Phonon库在播放声音时都存在严重问题。它们都需要主消息循环,这意味着主线程中的轻微阻塞或播放声音的延迟。最终他们都使用后台线程,但滞后很容易被注意到。更不用说Phonon在许多平台上都有可疑的支持。
我和他们一起工作了一段时间,并尝试构建一个简单的声音系统来播放用户界面声音(只是偶尔发出哔哔声和流行音乐)。使用标准Qt库是不可能的。
我建议使用OpenAL,我最终做了。它是一个相对简单的库,似乎有很好的跨平台支持。另一个选项是SDL_mixer,但OpenAL似乎更容易在Windows上安装(尽管可能不是很多)。所以基本上如果QSound::play
没有达到你想要的水平,那么标准的Qt API将不适合你。
另一个重要的注意事项,不要试图使用单独的线程来修复Qt声音api。它不会起作用。 Phonon至少要求在主线程中实例化并调用。
答案 1 :(得分:3)
http://doc.qt.nokia.com/latest/qsound.html
Qt在GUI应用程序中提供最常用的音频操作:异步播放声音文件。使用静态play()函数最容易实现:
QSound::play("mysounds/bells.wav");
这似乎是一个异步操作,所以它不应该阻止你的主线程。
答案 2 :(得分:0)
我一直在使用QT音响系统,尤其是线程问题。
此解决方案适合我:
示例:
http://doc.qt.io/qt-5/qtmultimediawidgets-player-player-cpp.html
答案 3 :(得分:0)
QMediaPlayer不应该阻止你的线程。
#include <QtMultimedia/QMediaPlayer>
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("/path"));
player->setVolume(50);
player->play();