Evgenii Legotckoi
Evgenii LegotckoiМаусым 29, 2016, 9: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 сыныптары қолжетімсіз болады.

#-------------------------------------------------
#
# Project created by QtCreator 2016-06-29T11:25:56
#
#-------------------------------------------------

QT       += core gui multimedia

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = SimplePlayer
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

RESOURCES += \
    buttons.qrc

виджет.h

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

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

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

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStandardItemModel>
#include <QMediaPlayer>
#include <QMediaPlaylist>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_btn_add_clicked();              // Слот для обработки добавления треков через диалоговое окно

private:
    Ui::Widget *ui;
    QStandardItemModel  *m_playListModel;   // Модель данных плейлиста для отображения
    QMediaPlayer        *m_player;          // Проигрыватель треков
    QMediaPlaylist      *m_playlist;        // Плейлиста проигрывателя
};

#endif // WIDGET_H

widget.cpp

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

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

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

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDir>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    // Настройка таблицы плейлиста
    m_playListModel = new QStandardItemModel(this);
    ui->playlistView->setModel(m_playListModel);    // Устанавливаем модель данных в TableView
    // Устанавливаем заголовки таблицы
    m_playListModel->setHorizontalHeaderLabels(QStringList()  << tr("Audio Track")
                                                            << tr("File Path"));
    ui->playlistView->hideColumn(1);    // Скрываем колонку, в которой хранится путь к файлу
    ui->playlistView->verticalHeader()->setVisible(false);                  // Скрываем нумерацию строк
    ui->playlistView->setSelectionBehavior(QAbstractItemView::SelectRows);  // Включаем выделение строк
    ui->playlistView->setSelectionMode(QAbstractItemView::SingleSelection); // Разрешаем выделять только одну строку
    ui->playlistView->setEditTriggers(QAbstractItemView::NoEditTriggers);   // Отключаем редактирование
    // Включаем подгонку размера последней видимой колонки к ширине TableView
    ui->playlistView->horizontalHeader()->setStretchLastSection(true);

    m_player = new QMediaPlayer(this);          // Инициализируем плеер
    m_playlist = new QMediaPlaylist(m_player);  // Инициализируем плейлист
    m_player->setPlaylist(m_playlist);          // Устанавливаем плейлист в плеер
    m_player->setVolume(70);                    // Устанавливаем громкость воспроизведения треков
    m_playlist->setPlaybackMode(QMediaPlaylist::Loop);  // Устанавливаем циклический режим проигрывания плейлиста

    // подключаем кнопки управления к слотам управления
    // Здесь отметим, что навигация по плейлисту осуществляется именно через плейлист
    // а запуск/пауза/остановка через сам плеер
    connect(ui->btn_previous, &QToolButton::clicked, m_playlist, &QMediaPlaylist::previous);
    connect(ui->btn_next, &QToolButton::clicked, m_playlist, &QMediaPlaylist::next);
    connect(ui->btn_play, &QToolButton::clicked, m_player, &QMediaPlayer::play);
    connect(ui->btn_pause, &QToolButton::clicked, m_player, &QMediaPlayer::pause);
    connect(ui->btn_stop, &QToolButton::clicked, m_player, &QMediaPlayer::stop);

    // При даблклике по треку в таблице устанавливаем трек в плейлисте
    connect(ui->playlistView, &QTableView::doubleClicked, [this](const QModelIndex &index){
        m_playlist->setCurrentIndex(index.row());
    });

    // при изменении индекса текущего трека в плейлисте, устанавливаем название файла в специальном лейбле
    connect(m_playlist, &QMediaPlaylist::currentIndexChanged, [this](int index){
        ui->currentTrack->setText(m_playListModel->data(m_playListModel->index(index, 0)).toString());
    });
}

Widget::~Widget()
{
    delete ui;
    delete m_playListModel;
    delete m_playlist;
    delete m_player;
}

void Widget::on_btn_add_clicked()
{
    // С помощью диалога выбора файлов делаем множественный выбор mp3 файлов
    QStringList files = QFileDialog::getOpenFileNames(this,
                                                      tr("Open files"),
                                                      QString(),
                                                      tr("Audio Files (*.mp3)"));

    // Далее устанавливаем данные по именам и пути к файлам
    // в плейлист и таблицу отображающую плейлист
    foreach (QString filePath, files) {
        QList<QStandardItem *> items;
        items.append(new QStandardItem(QDir(filePath).dirName()));
        items.append(new QStandardItem(filePath));
        m_playListModel->appendRow(items);
        m_playlist->addMedia(QUrl(filePath));
    }
}

Барлығы

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

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

Бейне оқулық

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

S
  • Маусым 10, 2017, 3: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, 10:35 Т.Ж.

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

DV
  • Сәуір 27, 2021, 3:40 Т.Қ.

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

Evgenii Legotckoi
  • Шілде 2, 2021, 5:09 Т.Ж.

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

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

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

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

нет

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

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

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

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

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

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

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

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

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

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

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

Спасибо.

juvf
  • Қаң. 16, 2023, 10:18 Т.Қ.

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

Evgenii Legotckoi
  • Ақп. 7, 2023, 5:32 Т.Ж.

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

Пікірлер

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

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз