Qt:如何播放声音不阻塞主线程
Qt: How to play sound witout blocking main thread?
我想知道是否有一种简单的方法在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声音系统,特别是线程问题。
这个解决方案适合我:
- 转换任何wav到mp3,因为有播放的问题qt 5.5。
- 将这些mp3文件添加到QT (qrc)中的资源。
- 使用QMediaPlayer播放声音
例子:
http://doc.qt.io/qt-5/qtmultimediawidgets-player-player-cpp.html https://www.youtube.com/watch?v=DS7CDpIrwN4QMediaPlayer不应该阻塞你的线程。
#include <QtMultimedia/QMediaPlayer>
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("/path"));
player->setVolume(50);
player->play();
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 无法从其他线程播放QMediaPlayer
- 在MIDI播放线程上降低CPU
- 有没有一种简单的方法可以使用SFML在后台线程中播放声音
- 在另一个线程中播放声音
- C++ - 通过多线程同时播放多个蜂鸣音
- mciSendString 不会暂停从线程播放的声音
- c线程-为什么mmsystem(使用mciSendString)不播放声音文件
- Win32 API多线程播放.wav文件没有延迟
- 声音多线程
- 如何从视频播放器的辅助线程在主窗口中显示
- 如何使一个线程在MFC中移动滑块控件相对于正在播放的音频文件
- Qt:如何播放声音不阻塞主线程