Qt:如何在不阻塞主线程的情况下播放声音?

时间:2011-04-08 20:36:46

标签: c++ qt qt4 audio

我想知道在Qt中有一种简单的方法可以在不阻塞主线程的情况下播放声音吗?

我知道,我应该开始一个单独的线程来做到这一点。但也许有捷径? :)

感谢您的帮助。

4 个答案:

答案 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音响系统,尤其是线程问题。

此解决方案适合我:

  1. 将任何wav转换为mp3,因为播放wavs存在问题 qt 5.5。
  2. 将这些mp3文件添加到QT(qrc)中的资源。
  3. 使用QMediaPlayer播放声音。
  4. 示例:

    http://doc.qt.io/qt-5/qtmultimediawidgets-player-player-cpp.html

    https://www.youtube.com/watch?v=DS7CDpIrwN4

答案 3 :(得分:0)

QMediaPlayer不应该阻止你的线程。

#include <QtMultimedia/QMediaPlayer>

QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("/path"));
player->setVolume(50);
player->play();