Qt: Как воспроизвести звук, не блокируя основной поток?

Мне интересно, есть ли в Qt простой способ воспроизведения звука без блокировки основного потока?

Я знаю, что обычно я должен начать отдельный поток, чтобы сделать это. Но, может быть, есть короткий путь? :)

Спасибо за помощь.


person Sebastian Dusza    schedule 08.04.2011    source источник


Ответы (4)


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

Qt обеспечивает наиболее часто требуемую операцию со звуком в приложениях с графическим интерфейсом: асинхронное воспроизведение звукового файла. Это проще всего сделать с помощью статической функции play():

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

Похоже, что это асинхронная операция, поэтому она не должна блокировать ваш основной поток.

person rtpg    schedule 08.04.2011
comment
Обратите внимание, что это будет работать только для звуковых файлов, а не для звуков, сгенерированных программно. Первое, вероятно, все, что нужно OP, но относительно последнего я обнаружил, что выполнение действительно блокируется в QAudioOutput::start(). - person Matt Phillips; 09.04.2011

Стандартная библиотека QSound и библиотека Phonon имеют серьезные проблемы с воспроизведением звука. Они оба требуют основного цикла сообщений, что означает либо небольшой блок в основном потоке, либо задержку воспроизведения звука. В конечном итоге они оба используют фоновый поток, но отставание легко заметить. Не говоря уже о том, что Phonon имеет сомнительную поддержку на многих платформах.

Я некоторое время работал с обоими и пытался создать простую звуковую систему для воспроизведения звуков пользовательского интерфейса (просто время от времени пищать и трещать). Это просто невозможно с использованием стандартной библиотеки Qt.

Я бы рекомендовал использовать OpenAL, что я в конце концов и сделал. Это относительно простая библиотека и, кажется, имеет хорошую межплатформенную поддержку. Другой вариант — SDL_mixer, но OpenAL проще установить в Windows (хотя, возможно, ненамного). Таким образом, в основном, если QSound::play не делает то, что вы хотите, стандартный Qt API не будет работать для вас.


Еще одно важное замечание: не пытайтесь исправить звуковой API Qt, используя отдельный поток. Это не сработает. Phonon, по крайней мере, требует создания и вызова в основном потоке.

person edA-qa mort-ora-y    schedule 09.04.2011
comment
+1 за предложение OpenAL. Более ранние версии SDL было сложно интегрировать в циклы обработки сообщений других библиотек. - person ChrisV; 09.04.2011
comment
QSound у меня работает нормально. Полезно знать об OpenAL, может пригодится в будущем. - person Sebastian Dusza; 09.04.2011
comment
Я рад, что не пробовал отдельный маршрут потока. Я не могу заставить воспроизведение без пауз работать в Windows, и я рассматривал возможность использования SDL. Приятно знать, что OpenAL также является опцией. - person Dave Stenglein; 12.06.2012
comment
Для дальнейшего использования не могли бы вы указать версии Qt/OpenAL, которые вы использовали, и платформы, на которых вы тестировали? - person Andreas Haferburg; 25.09.2012

Я много работал со звуковыми системами QT, особенно с проблемами потоков.

Это решение работает для меня:

  1. Преобразуйте любой wav в mp3, потому что есть проблемы с воспроизведением wav в 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

person user257980    schedule 26.01.2016

QMediaPlayer не должен блокировать ваш поток.

#include <QtMultimedia/QMediaPlayer>

QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("/path"));
player->setVolume(50);
player->play();
person Am.sheikhjafari    schedule 10.04.2016