Qt:如何播放声音不阻塞主线程

Qt: How to play sound witout blocking main thread?

本文关键字:线程 播放声音 Qt      更新时间:2023-10-16

我想知道是否有一种简单的方法在Qt中播放声音而不阻塞主线程?

我知道通常我应该启动一个单独的线程来做这件事。但也许有捷径?:)

标准QSound和Phonon库在播放声音时都有明显的问题。它们都需要主消息循环,这意味着在主线程中有一个轻微的阻塞或播放声音的延迟。最终,它们都使用后台线程,但延迟很容易注意到。更不用说Phonon在许多平台上的支持问题了。

我已经工作了一段时间,并试图建立一个简单的声音系统播放用户界面的声音(只是偶尔哔哔声和流行)。使用标准Qt库是不可能的。

我建议使用OpenAL,我最终也这么做了。它是一个相对直接的库,似乎有很好的跨平台支持。另一个选择是SDL_mixer,但OpenAL似乎更容易在Windows上安装(可能不是很多)。所以基本上,如果QSound::play不做你想要的,那么标准的Qt API不会为你工作。


另一个重要的注意事项,不要费心尝试使用单独的线程来修复Qt声音api。这行不通。Phonon至少需要在主线程中实例化并调用

http://doc.qt.nokia.com/latest/qsound.html

Qt提供了GUI应用程序中最常用的音频操作:异步播放声音文件。这是使用静态play()函数最容易实现的:

 QSound::play("mysounds/bells.wav");

这看起来像是一个异步操作,所以它不应该阻塞主线程。

我一直在使用QT声音系统,特别是线程问题。

这个解决方案适合我:

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

例子:

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

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

QMediaPlayer不应该阻塞你的线程。

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