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 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

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

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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