Мне интересно, есть ли в Qt простой способ воспроизведения звука без блокировки основного потока?
Я знаю, что обычно я должен начать отдельный поток, чтобы сделать это. Но, может быть, есть короткий путь? :)
Спасибо за помощь.
Мне интересно, есть ли в Qt простой способ воспроизведения звука без блокировки основного потока?
Я знаю, что обычно я должен начать отдельный поток, чтобы сделать это. Но, может быть, есть короткий путь? :)
Спасибо за помощь.
http://doc.qt.nokia.com/latest/qsound.html
Qt обеспечивает наиболее часто требуемую операцию со звуком в приложениях с графическим интерфейсом: асинхронное воспроизведение звукового файла. Это проще всего сделать с помощью статической функции play():
QSound::play("mysounds/bells.wav");
Похоже, что это асинхронная операция, поэтому она не должна блокировать ваш основной поток.
Стандартная библиотека QSound и библиотека Phonon имеют серьезные проблемы с воспроизведением звука. Они оба требуют основного цикла сообщений, что означает либо небольшой блок в основном потоке, либо задержку воспроизведения звука. В конечном итоге они оба используют фоновый поток, но отставание легко заметить. Не говоря уже о том, что Phonon имеет сомнительную поддержку на многих платформах.
Я некоторое время работал с обоими и пытался создать простую звуковую систему для воспроизведения звуков пользовательского интерфейса (просто время от времени пищать и трещать). Это просто невозможно с использованием стандартной библиотеки Qt.
Я бы рекомендовал использовать OpenAL, что я в конце концов и сделал. Это относительно простая библиотека и, кажется, имеет хорошую межплатформенную поддержку. Другой вариант — SDL_mixer, но OpenAL проще установить в Windows (хотя, возможно, ненамного). Таким образом, в основном, если QSound::play
не делает то, что вы хотите, стандартный Qt API не будет работать для вас.
Еще одно важное замечание: не пытайтесь исправить звуковой API Qt, используя отдельный поток. Это не сработает. Phonon, по крайней мере, требует создания и вызова в основном потоке.
Я много работал со звуковыми системами QT, особенно с проблемами потоков.
Это решение работает для меня:
Примеры:
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();