Evgenii Legotckoi
Маусым 29, 2016, 7:06 Т.Қ.

Qt/C++ - 051-сабақ. QMediaPlayer - Qt аудио ойнатқышы

Мен Qt / C ++ көмегімен mp3 файлдары үшін қарапайым аудио ойнатқыш жазуды ұсынамын, оның ойнату тізімі, тректерді бастау / кідірту / тоқтату, сондай-ақ тректер бойынша айналдыру мүмкіндігі бар.

Бұл идеяны жүзеге асыру үшін Qt-да мультимедиа. модуліне жататын QMediaPlayer және QMediaPlaylist кластары бар. Ал ойнату тізімін көрсету үшін QStandardItemModel және қолданамыз. QTableView.

Осы циклдің мақалалары:

Жоба құрылымы

  • SimplePlayer.pro - жоба профилі;
  • main.cpp - негізгі функциясы бар файл;
  • widget.ui - қолданба терезесінің пішін файлы;
  • widget.h - қолданба терезесінің тақырып файлы;
  • widget.cpp - қолданба терезесінің бастапқы код файлы;
  • buttons.qrc - қолданба түймелерінің белгішелерінің ресурстық файлы.

widget.ui

Біз графикалық дизайнердің көмегімен қолданба интерфейсін жасаймыз және ол келесідей болуы керек.

Қолданба интерфейсі келесі элементтерді қамтиды:

  • btn_add (QToolButton*) - ойнату тізіміне тректерді қосуға жауапты;
  • btn_next (QToolButton*) - ойнату тізімін алға жылжытуға жауапты;
  • btn_previous (QToolButton*) - ойнату тізімі бойынша кері айналдыруға жауапты;
  • btn_play (QToolButton*) - жолды ойнауға жауапты;
  • btn_pause (QToolButton*) - жолды кідіртуге жауапты;
  • btn_stop (QToolButton*) - жолды тоқтатуға жауапты;
  • currentTrack (QLabel*) - ағымдағы жолды көрсететін белгі;
  • playlistView (QTableView*) - ойнату тізімін көрсетуге жауапты кесте.

SimplePlayer.pro

Жоба профиліне мультимедиа модулін қосуды ұмытпаңыз, әйтпесе QMediaPlayer және QMediaPlaylist сыныптары қолжетімсіз болады.

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2016-06-29T11:25:56
  4. #
  5. #-------------------------------------------------
  6.  
  7. QT += core gui multimedia
  8.  
  9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  10.  
  11. TARGET = SimplePlayer
  12. TEMPLATE = app
  13.  
  14.  
  15. SOURCES += main.cpp\
  16. widget.cpp
  17.  
  18. HEADERS += widget.h
  19.  
  20. FORMS += widget.ui
  21.  
  22. RESOURCES += \
  23. buttons.qrc

виджет.h

Ойнату тізімін көрсетуді жүзеге асыру үшін сізге QStandardItemModel пайдалану керек. Онда аудио файлдарға жолдар, сондай-ақ аудио файлдардың атаулары болады. Бірінші баған аудио файлдың атауы болады, ал екіншісі толық жол болады, бірақ бұл баған ойнату тізімін көрсетуге жауапты болатын QTableView нысанында жасырылады.

Сондай-ақ, медиа көздері ретінде файл жолдары QMediaPlayer ішінде орналастырылатын QMediaPlaylist нысанында орналастырылуы керек.

Бұл нысандарға сілтегіштер қолданба терезесінің тақырып файлына орналастырылады. Сондай-ақ ойнату тізіміне тректерді қосу түймешігін басу арқылы өңдеуге арналған интерфейс дизайнері арқылы автоматты түрде жасалған ұяшық бар.

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5. #include <QStandardItemModel>
  6. #include <QMediaPlayer>
  7. #include <QMediaPlaylist>
  8.  
  9. namespace Ui {
  10. class Widget;
  11. }
  12.  
  13. class Widget : public QWidget
  14. {
  15. Q_OBJECT
  16.  
  17. public:
  18. explicit Widget(QWidget *parent = 0);
  19. ~Widget();
  20.  
  21. private slots:
  22. void on_btn_add_clicked(); // Слот для обработки добавления треков через диалоговое окно
  23.  
  24. private:
  25. Ui::Widget *ui;
  26. QStandardItemModel *m_playListModel; // Модель данных плейлиста для отображения
  27. QMediaPlayer *m_player; // Проигрыватель треков
  28. QMediaPlaylist *m_playlist; // Плейлиста проигрывателя
  29. };
  30.  
  31. #endif // WIDGET_H

widget.cpp

Ойнатқышты іске асыру үшін қолданба терезесінің тақырып файлында жарияланған QMediaPlayer, QMediaPlaylist және QStandardItemModel нысандарын инициализациялау қажет. Конструктордың бірінші жартысында кестенің көрінісі ойнату тізімін көрсету үшін конфигурацияланады, ал екінші жартысында ойнатқыштың өзі конфигурацияланады. Ойнатқыш m_playlist (навигация үшін) және m_player (бастау/кідірту/тоқтату үшін) басқару ұяларына қосылған түймелер арқылы басқарылады.

Ағымдағы жолды өзгерткен кезде, ойнатқыш өзгертуге дейін болған жолды ойнатуды автоматты түрде аяқтайды және жаңа жолды ойната бастайды.

QMediaPlaylist -де кестеде көрсетілетін үлгі жоқ болғандықтан, біз QStandardItemModel сыныбын қолданамыз, сондықтан файл жолы деректерін сол жерде де, сол жерде де қосуға тура келеді.

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QFileDialog>
  4. #include <QDir>
  5.  
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. // Настройка таблицы плейлиста
  12. m_playListModel = new QStandardItemModel(this);
  13. ui->playlistView->setModel(m_playListModel); // Устанавливаем модель данных в TableView
  14. // Устанавливаем заголовки таблицы
  15. m_playListModel->setHorizontalHeaderLabels(QStringList() << tr("Audio Track")
  16. << tr("File Path"));
  17. ui->playlistView->hideColumn(1); // Скрываем колонку, в которой хранится путь к файлу
  18. ui->playlistView->verticalHeader()->setVisible(false); // Скрываем нумерацию строк
  19. ui->playlistView->setSelectionBehavior(QAbstractItemView::SelectRows); // Включаем выделение строк
  20. ui->playlistView->setSelectionMode(QAbstractItemView::SingleSelection); // Разрешаем выделять только одну строку
  21. ui->playlistView->setEditTriggers(QAbstractItemView::NoEditTriggers); // Отключаем редактирование
  22. // Включаем подгонку размера последней видимой колонки к ширине TableView
  23. ui->playlistView->horizontalHeader()->setStretchLastSection(true);
  24.  
  25. m_player = new QMediaPlayer(this); // Инициализируем плеер
  26. m_playlist = new QMediaPlaylist(m_player); // Инициализируем плейлист
  27. m_player->setPlaylist(m_playlist); // Устанавливаем плейлист в плеер
  28. m_player->setVolume(70); // Устанавливаем громкость воспроизведения треков
  29. m_playlist->setPlaybackMode(QMediaPlaylist::Loop); // Устанавливаем циклический режим проигрывания плейлиста
  30.  
  31. // подключаем кнопки управления к слотам управления
  32. // Здесь отметим, что навигация по плейлисту осуществляется именно через плейлист
  33. // а запуск/пауза/остановка через сам плеер
  34. connect(ui->btn_previous, &QToolButton::clicked, m_playlist, &QMediaPlaylist::previous);
  35. connect(ui->btn_next, &QToolButton::clicked, m_playlist, &QMediaPlaylist::next);
  36. connect(ui->btn_play, &QToolButton::clicked, m_player, &QMediaPlayer::play);
  37. connect(ui->btn_pause, &QToolButton::clicked, m_player, &QMediaPlayer::pause);
  38. connect(ui->btn_stop, &QToolButton::clicked, m_player, &QMediaPlayer::stop);
  39.  
  40. // При даблклике по треку в таблице устанавливаем трек в плейлисте
  41. connect(ui->playlistView, &QTableView::doubleClicked, [this](const QModelIndex &index){
  42. m_playlist->setCurrentIndex(index.row());
  43. });
  44.  
  45. // при изменении индекса текущего трека в плейлисте, устанавливаем название файла в специальном лейбле
  46. connect(m_playlist, &QMediaPlaylist::currentIndexChanged, [this](int index){
  47. ui->currentTrack->setText(m_playListModel->data(m_playListModel->index(index, 0)).toString());
  48. });
  49. }
  50.  
  51. Widget::~Widget()
  52. {
  53. delete ui;
  54. delete m_playListModel;
  55. delete m_playlist;
  56. delete m_player;
  57. }
  58.  
  59. void Widget::on_btn_add_clicked()
  60. {
  61. // С помощью диалога выбора файлов делаем множественный выбор mp3 файлов
  62. QStringList files = QFileDialog::getOpenFileNames(this,
  63. tr("Open files"),
  64. QString(),
  65. tr("Audio Files (*.mp3)"));
  66.  
  67. // Далее устанавливаем данные по именам и пути к файлам
  68. // в плейлист и таблицу отображающую плейлист
  69. foreach (QString filePath, files) {
  70. QList<QStandardItem *> items;
  71. items.append(new QStandardItem(QDir(filePath).dirName()));
  72. items.append(new QStandardItem(filePath));
  73. m_playListModel->appendRow(items);
  74. m_playlist->addMedia(QUrl(filePath));
  75. }
  76. }

Барлығы

Қолданба іске қосылғаннан кейін mp3 тректерді ашып, оларды тыңдауға болады.

Qt аудио ойнатқышын жүктеп алу

Бейне оқулық

Осы тақырып бойынша ұсынылатын мақалалар

Мақала бойынша сұралады1сұрақтар(лар)

8

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

S
  • Маусым 10, 2017, 1:26 Т.Қ.

Скажите, пожалуйста, как на линуксе исправить ошибку , связанную с непраильной схемой пути к файлу - "Error: "Invalid URI ...."" и далее соответственно GSteamer; unable to pause...

На официальном форуме указано на то, что "when passing local file to the media player, you need to use the "file://" scheme so it knows it has to look in to the file system." Но что конкретно из этого стоит вынести, не ясно.
Благодарен за внимание.
Evgenii Legotckoi
  • Маусым 10, 2017, 8:35 Т.Қ.

Ответил на форуме

DV
  • Сәуір 28, 2021, 1:40 Т.Ж.

Добрый вечер. Хотел бы получить консультацию по работе с проектом на Mac OS. Открыл проект в QT и собрал его. Проблема в том, что он не воспроизводит треки и их названия зацикленно мелькают в поле текущего трека. По системе:
- Mac OS 10.14
- QT 5.15.2
- XCode 10.2
С чем это может быть связано. Заранее благодарен.

Evgenii Legotckoi
  • Шілде 2, 2021, 3:09 Т.Қ.

С Mac OS опыта работы не имею на данный момент

АГ
  • Маусым 21, 2022, 3:48 Т.Қ.

можно ли из этого плеера сделать многоканалов воспроизведения ?

Evgenii Legotckoi
  • Маусым 21, 2022, 3:54 Т.Қ.

нет

АГ
  • Маусым 21, 2022, 4:07 Т.Қ.

есть такая вообще возможность ?

Evgenii Legotckoi
  • Маусым 21, 2022, 4:26 Т.Қ.
  • (өңделген)

Не думаю, QMediaPlayer в один поток проигрывает. Если вам нужно одновременное воспроизведение нескольких аудиоисточников, то вам нужна Bass audio library , насколько знаю, её обычно используют для подобных вещей.

Р5
  • Қыр. 13, 2022, 6:54 Т.Қ.

Здравствуйте. Подскажите пожалуйста, как решить проблему
multimedia модуль не распознается

juvf
  • Қар. 25, 2022, 12:14 Т.Қ.

Добрый день.
Подскажите, как можно перехватить в Qt или Qml уровень воспроизводимого звука? Т.е. требуется сделать виртуальный винтажный индикатор (стрелочный или светодиодный), который бы показывал уровень звука. И желательно без усилиения. Т.е. в файле mp3 допустим записана синусоида 1000 кГц, амплитудой 0.5 (минимальный уровень 0.0, макс 1.0), то на индикаторе должно быть 0.5, в независимости от того, как выкручена громкость на регуляторе звука плеера, винды/линукса, калонок или внешнего УМ. Как такое возможно реализовать (желательно кроссплатформено с помощью qt/qml)? Куда копать? Как-то перехватывать декодирование mp3 и допустим раз в 100 мс обновлять виджет "Индикатор"?

Evgenii Legotckoi
  • Жел. 12, 2022, 3:05 Т.Қ.

Qt не располагает средствами для визуализации формы звукового сигнала в файле. То есть из модуля Qt multimedia вы не сможете забрать график звука а потом его обработать так, чтобы вы получали нужный вам результат. Это нужно реализовывать с помощью сторонних библиотек, а потом отрисовывать уже в Qt/Qml. Возможно Bass Dll может в этом помочь.

juvf
  • Жел. 12, 2022, 3:06 Т.Қ.

Спасибо.

juvf
  • Қаң. 17, 2023, 9:18 Т.Ж.

PS. Почти дописал плеер на QML. Уперся в ограничения QML. Переписываю плеер на с++/qt, а графика останится в qml. Нашел то, что мне надо, а именно индикатор звука. Qt может перехватывать аудиопоток и анализировать уровень звука. Кому интересно - подробно в примерах в QtCreator "Media Player Example".

Evgenii Legotckoi
  • Ақп. 7, 2023, 4:32 Т.Қ.

А он анализирует уровень звука по частотам, как эквайлайзер? Я просто подумал, что вам как в аналоговом эквалайзере нужно...

AK
  • Сәуір 1, 2025, 11:41 Т.Ж.
  • (өңделген)

Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поскольку в 6 версии вырезали QMediaPlaylist .

Нашел класс QAudioOutput , но абсолютно не понимаю, как связать его с QMediaPlayer , поскольку в нем есть только метод SetVideoOutput . Может кто-по подсказать решение? Гуглеж, поиск по форуму Qt и документации ничего не дали, даже ChatGPT выдает решение с несуществующими классами и методами

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз