Qt: Как воспроизвести звук без блокировки основного потока? - PullRequest
3 голосов
/ 09 апреля 2011

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

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

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

Ответы [ 4 ]

10 голосов
/ 09 апреля 2011

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

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

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


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

3 голосов
/ 09 апреля 2011

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

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

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

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

0 голосов
/ 10 апреля 2016

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

#include <QtMultimedia/QMediaPlayer>

QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("/path"));
player->setVolume(50);
player->play();
0 голосов
/ 26 января 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...