Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. help to fix some problem in my QmediaPlayer
Forum Updated to NodeBB v4.3 + New Features

help to fix some problem in my QmediaPlayer

Scheduled Pinned Locked Moved Unsolved General and Desktop
7 Posts 3 Posters 1.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    saber
    wrote on last edited by saber
    #1

    i made a palyer based on qmediaplayer

    here is the cpp file.

    
    #include "coreplayer.h"
    #include "ui_coreplayer.h"
    
    #include <QMediaService>
    #include <QVideoProbe>
    #include <QAudioProbe>
    #include <QMediaMetaData>
    #include <QtWidgets>
    #include <QVideoWidget>
    #include <QStandardItemModel>
    
    
    coreplayer::coreplayer(QWidget *parent):QWidget(parent),ui(new Ui::coreplayer)
       , playerState(QMediaPlayer::StoppedState)
    {
        qDebug() << "coreplayer opening";
        ui->setupUi(this);
    
        mModel = new QStandardItemModel(this);
        mNumberOfFiles = 0;
        ui->shortcut->setVisible(0);
        ui->folderLineEdit->setReadOnly(true);
        ui->medialist->setModel(mModel);
    
        player = new QMediaPlayer(this);
        connect(player, SIGNAL(durationChanged(qint64)), SLOT(durationChanged(qint64)));
        connect(player, SIGNAL(positionChanged(qint64)), SLOT(positionChanged(qint64)));
        connect(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),this, SLOT(statusChanged(QMediaPlayer::MediaStatus)));
        connect(player, SIGNAL(bufferStatusChanged(int)), this, SLOT(bufferingProgress(int)));
        connect(player, SIGNAL(videoAvailableChanged(bool)), this, SLOT(videoAvailableChanged(bool)));
        connect(player, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(displayErrorMessage()));
    //    connect(player, &QMediaPlayer::stateChanged, this, &coreplayer::stateChanged);
    
        QVideoWidget *Vwidget = new QVideoWidget(this);
        player->setVideoOutput(Vwidget);
        ui->view->addWidget(Vwidget);
    
        if(isPlayerAvailable()){
            for (QPushButton *b : ui->navigation->findChildren<QPushButton*>()){
                b->setEnabled(false);
            }
            ui->playlist->setEnabled(true);
            ui->seekBar->setEnabled(false);
            ui->volume->setEnabled(false);
        }
    
        ui->seekBar->setRange(0, player->duration() / 1000);
        connect(ui->seekBar,SIGNAL(sliderMoved(int)),this,SLOT(seek(int)));
    
        if (!isPlayerAvailable()) {
            messageEngine(tr("The QMediaPlayer object does not have a valid service.\nPlease check the media service plugins are installed."),"Warning");
         }
    
        ui->numberOfFiles->setVisible(0);
    
        audioMimes();
        videoMimes();
        shotcuts();
    }
    
    coreplayer::~coreplayer()
    {
        qDebug()<<"corepalyer closing";
        delete ui;
    }
    
    void coreplayer::shotcuts(){
        QShortcut* shortcut;
    
        shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_O), this);
        connect(shortcut, &QShortcut::activated, this, &coreplayer::on_open_clicked);
        shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Left), this);
        connect(shortcut, &QShortcut::activated, this, &coreplayer::on_next_clicked);
        shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Right), this);
        connect(shortcut, &QShortcut::activated, this, &coreplayer::on_previous_clicked);
        shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Enter), this);
        connect(shortcut, &QShortcut::activated, this, &coreplayer::on_stop_clicked);
    //    shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Space), this);
    //    connect(shortcut, &QShortcut::activated, this, &coreplayer::on_play_clicked);
    //    shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_M), this);
    //    connect(shortcut, &QShortcut::activated, this, &coreplayer::on_mute_clicked);
    
        shortcut = new QShortcut(QKeySequence(Qt::Key_Left), this);
        connect(shortcut, SIGNAL(activated()), this, SLOT(seekLeft()));
        shortcut = new QShortcut(QKeySequence(Qt::Key_Right), this);
        connect(shortcut, SIGNAL(activated()), this, SLOT(seekRight()));
        shortcut = new QShortcut(QKeySequence(Qt::Key_Up), this);
        connect(shortcut, SIGNAL(activated()), this, SLOT(volumnUP()));
        shortcut = new QShortcut(QKeySequence(Qt::Key_Down), this);
        connect(shortcut, SIGNAL(activated()), this, SLOT(volumnDown()));
        //seekbar seeking(4s) by right left arrow
        //volumn up down by up down arrow
    }
    
    void coreplayer::closeEvent(QCloseEvent *event) {
        Q_UNUSED(event);
        on_stop_clicked();
    }
    
    void coreplayer::videoMimes() {
    
        QMimeDatabase mime;
        QList<QMimeType> d = mime.allMimeTypes();
    
        foreach (QMimeType s, d) {
            //Store for Video
            if (s.name().startsWith("video"))
                if (!s.preferredSuffix().isNull())
                    videomimes.append(s.name());
        }
    
    //    audiomimes.replace(audiomimes.indexOf("audio/mpeg"), "audio/mp3");//error
        videomimes.sort();
    }
    
    QStringList coreplayer::getVideos(const QString path) {
    
        QDir dir(path);
        QStringList videos;
        for (QString file : dir.entryList()) {
            if (file == "." || file == "..") {
                continue;
            }
                //for each video check the file.
                foreach (QString s, videomimes) {
                    if (QFileInfo(file).completeSuffix() == s.split("/").at(1) || QFileInfo(file).suffix() == s.split("/").at(1))
                        videos.append(path + "/" + file);
                }
        }
        return videos;
    }
    
    void coreplayer::audioMimes() {
    
        QMimeDatabase mime;
        QList<QMimeType> d = mime.allMimeTypes();
    
        foreach (QMimeType s, d) {
            //Store for Audio
            if (s.name().startsWith("audio"))
                if (!s.preferredSuffix().isNull())
                    audiomimes.append(s.name());
        }
    
        audiomimes.replace(audiomimes.indexOf("audio/mpeg"), "audio/mp3");
        audiomimes.sort();
    
    }
    
    QStringList coreplayer::getAudios(const QString path) {
    
        QDir dir(path);
        QStringList audios;
        for (QString file : dir.entryList()) {
            if (file == "." || file == "..") {
                continue;
            }
                //for each audio check the file.
                foreach (QString s, audiomimes) {
                    if ((QFileInfo(file).completeSuffix()) == (s.split("/").at(1)) || QFileInfo(file).suffix() == s.split("/").at(1))
                        audios.append(path + "/" + file);
                }
        }
        return audios;
    }
    
    bool coreplayer::isPlayerAvailable() const
    {
        return player->isAvailable();
    }
    
    void coreplayer::durationChanged(qint64 duration)
    {
        this->duration = duration/1000;
        ui->seekBar->setMaximum(duration / 1000);
    }
    
    void coreplayer::positionChanged(qint64 progress)
    {
        if (!ui->seekBar->isSliderDown()) {
            ui->seekBar->setValue(progress / 1000);
        }
        updateDurationInfo(progress / 1000);
    }
    
    void coreplayer::seek(int seconds)
    {
        player->setPosition(seconds * 1000);
    }
    
    void coreplayer::statusChanged(QMediaPlayer::MediaStatus status)
    {
        handleCursor(status);
    
        // handle status message
        switch (status) {
        case QMediaPlayer::UnknownMediaStatus:
        case QMediaPlayer::NoMedia:
        case QMediaPlayer::LoadedMedia:
        case QMediaPlayer::BufferingMedia:
        case QMediaPlayer::BufferedMedia:
    //        setStatusInfo(QString());
            break;
        case QMediaPlayer::LoadingMedia:
            messageEngine("Loading...", "Info");
            break;
        case QMediaPlayer::StalledMedia:
            messageEngine("Media Stalled", "Info");
            break;
        case QMediaPlayer::EndOfMedia:
            QApplication::alert(this);
            break;
        case QMediaPlayer::InvalidMedia:
            messageEngine("InvalidMedia", "Warning");
            break;
        }
    }
    
    void coreplayer::handleCursor(QMediaPlayer::MediaStatus status)
    {
    #ifndef QT_NO_CURSOR
        if (status == QMediaPlayer::LoadingMedia ||
            status == QMediaPlayer::BufferingMedia ||
            status == QMediaPlayer::StalledMedia)
            setCursor(QCursor(Qt::BusyCursor));
        else
            unsetCursor();
    #endif
    }
    
    void coreplayer::bufferingProgress(int progress)
    {
        messageEngine(tr("Buffering %4%").arg(progress), "Info");
    }
    
    void coreplayer::displayErrorMessage()
    {
        messageEngine(player->errorString(), "Warning");
    }
    
    void coreplayer::updateDurationInfo(qint64 currentInfo)
    {
        QString time;
        if (currentInfo || duration) {
            QTime currentTime((currentInfo/3600)%60, (currentInfo/60)%60, currentInfo%60, (currentInfo*1000)%1000);
            QTime totalTime((duration/3600)%60, (duration/60)%60, duration%60, (duration*1000)%1000);
            QString format = "mm:ss";
            if (duration > 3600)
                format = "hh:mm:ss";
            time = currentTime.toString(format) + " / " + totalTime.toString(format);
        }
        ui->duration->setText(time);
    }
    
    void coreplayer::openPlayer(const QString path) {
    
        QFileInfo sp(path);
        QString selectedFilePath;
        QModelIndex index = mModel->index(0, 0);
        sp.isDir() ? selectedFilePath = path : selectedFilePath = sp.path();
        mModel->clear();
        ui->folderLineEdit->setText(selectedFilePath);
        QStringList list1 = getAudios(selectedFilePath);
        QStringList list2 = getVideos(selectedFilePath);
        QStringList lists;
        lists.append(list1);
        lists.append(list2);
        list1.clear();
        list2.clear();
        lists = lists.toSet().toList();
        for (int i = 0; i < lists.count(); ++i) {
            mModel->appendRow((new QStandardItem(QFileInfo(lists.at(i)).fileName())));
            if (sp.isFile() && (sp.fileName() == mModel->index(i, 0).data().toString())) {
                index = mModel->index(i, 0);
            }
        }
        mModel->sort(0);
        mNumberOfFiles = lists.count();
        if(mNumberOfFiles > 0){
             ui->numberOfFiles->setVisible(1);
             ui->numberOfFiles->setText(QString("Included Files: %1").arg(mNumberOfFiles));
        }
        if(!path.isEmpty()){
            for (QPushButton *b : ui->navigation->findChildren<QPushButton*>()){
                b->setEnabled(true);
            }
            ui->seekBar->setEnabled(true);
            ui->volume->setEnabled(true);
            player->setMedia(QUrl::fromLocalFile(path));
            player->play();
            ui->play->setChecked(true);
            messageEngine("Playing", "Info");
        }
    
    }
    
    void coreplayer::on_open_clicked()
    {
        QFileDialog dialog(this, tr("Open Media File"));
        QStringList mimes;
        mimes.append(audiomimes);
        mimes.append(videomimes);
        dialog.setMimeTypeFilters(mimes);
        dialog.selectMimeTypeFilter("audio/mp3");
        if (dialog.exec() == QDialog::Accepted) { //if dialog pressed accept means open then do this.
            openPlayer(QFileInfo(dialog.selectedFiles().first()).path());
            messageEngine("Files Collected", "Info");
            for (QPushButton *b : ui->navigation->findChildren<QPushButton*>()){
                b->setEnabled(true);
            }
            ui->seekBar->setEnabled(true);
            ui->volume->setEnabled(true);
        } else {
            messageEngine("Files collection rejected", "Info");
        }
    }
    
    QMediaPlayer::State coreplayer::state() const
    {
        return playerState;
    }
    
    void coreplayer::setState(QMediaPlayer::State state)
    {
        if (state != playerState) {
            playerState = state;
    
            switch (state) {
            case QMediaPlayer::StoppedState:
                ui->play->setChecked(0);
                ui->stop->setChecked(1);
                break;
            case QMediaPlayer::PlayingState:
                ui->play->setChecked(1);
                ui->stop->setChecked(0);
                break;
            case QMediaPlayer::PausedState:
                ui->play->setChecked(0);
                ui->stop->setChecked(0);
                break;
            }
        }
    }
    
    void coreplayer::on_play_clicked(bool checked)
    {
        if (checked ){
            setState(QMediaPlayer::PlayingState);
            player->play();
            play(ui->medialist->currentIndex().row());
            messageEngine("Playing", "Info");
        }
        else if (!checked){
            setState(QMediaPlayer::PausedState);
            player->pause();
            messageEngine("Paused", "Info");
        }
    }
    
    void coreplayer::on_mute_clicked(bool checked)
    {
        if (checked){
            player->setMuted(true);
            messageEngine("Mute", "Info");
        }
        else{
            player->setMuted(false);
        }
    }
    
    void coreplayer::on_volume_valueChanged(int value)
    {
       player->setVolume(value);
       QString vol = QString::number(value);
       ui->volume->setValue(value);
       messageEngine(vol, "Info");
    }
    
    void coreplayer::on_stop_clicked()
    {
        ui->stop->setEnabled(false);
        player->stop();
        ui->play->setChecked(false);
        player->setPosition(0);
        player->setMedia(NULL);
        ui->duration->setText("00:00 / 00:00");
        ui->workingOn->setText("");
        messageEngine("Stop", "Info");
    }
    
    void coreplayer::on_next_clicked()
    {
        player->stop();
        play(ui->medialist->currentIndex().row() + 1);
    }
    
    void coreplayer::on_previous_clicked()
    {
        player->stop();
        play(ui->medialist->currentIndex().row() - 1);
    }
    
    void coreplayer::setCurrentIndex(int currentIndex)
    {
        ui->medialist->setCurrentIndex(mModel->index(currentIndex, 0));
    }
    
    void coreplayer::setFolder(const QString &foldername)
    {
        mModel->clear();
        ui->folderLineEdit->setText(foldername);
        QStringList list1 = getAudios(foldername);
        QStringList list2 = getVideos(foldername);
    
        for (int i = 0; i < list1.count(); ++i) {
            mModel->appendRow((new QStandardItem(QFileInfo(list1.at(i)).fileName())));
        }
    
        for (int i = 0; i < list2.count(); ++i) {
            mModel->appendRow((new QStandardItem(QFileInfo(list2.at(i)).fileName())));
        }
    
        mNumberOfFiles = list1.count() + list2.count();
        ui->numberOfFiles->setText(QString("Included Files: %1")
                                        .arg(mNumberOfFiles));
    }
    
    void coreplayer::play(int index)
    {
        auto mediaPlayerState = player->state();
        if (mediaPlayerState == QMediaPlayer::PausedState) {
            player->play();
            return;
        } else if (mediaPlayerState == QMediaPlayer::PlayingState) {
            return;
        }
        if (index == -1 || index >= mNumberOfFiles) {
            return;
        }
        auto filename = ui->folderLineEdit->text()
                + "/" + mModel->index(index, 0).data().toString();
        player->setMedia(QUrl::fromLocalFile(filename));
        player->play();
        ui->medialist->setCurrentIndex(mModel->index(index, 0));
        ui->medialist->currentIndex().data().toInt();
        ui->workingOn->setText(mModel->index(index, 0).data().toString());
    }
    
    void coreplayer::on_medialist_doubleClicked(const QModelIndex &index)
    {
        player->stop();
        play(index.row());
        ui->play->setChecked(true);
        messageEngine("Playing", "Info");
    }
    
    void coreplayer::seekLeft() {
        if (!(ui->seekBar->value() == 0))
        {seek(ui->seekBar->value() - 4);}
    }
    
    void coreplayer::seekRight() {
        if (!(ui->seekBar->value() == ui->seekBar->maximum()))
        {seek(ui->seekBar->value() + 4);}
    }
    
    void coreplayer::volumnDown() {
        int x = ui->volume->value() - 5;
        if (!(ui->volume->value() == 0))
        {on_volume_valueChanged(x);}
    }
    
    void coreplayer::volumnUP() {
        int x = ui->volume->value() + 5;
        if (!(x == ui->volume->maximum()))
        { on_volume_valueChanged(x); }
    }
    
    void coreplayer::on_playlist_clicked(bool checked)
    {
        if(checked){
            ui->shortcut->setVisible(1);
        }else{
            ui->shortcut->setVisible(0);
        }
    }
    
    

    here is header

    
    #ifndef COREPLAYER_H
    #define COREPLAYER_H
    
    #include <QWidget>
    #include <QAbstractItemView>
    #include <QVideoProbe>
    #include <QVideoWidget>
    #include <QAudioProbe>
    #include <QStandardItemModel>
    #include <QMediaPlayer>
    #include <QCloseEvent>
    #include <QModelIndex>
    #include <QMediaPlaylist>
    
    #include "../corebox/corebox.h"
    #include "../corebox/globalfunctions.h"
    
    
    namespace Ui {
    class coreplayer;
    }
    
    class QAbstractItemView;
    class QLabel;
    class QVideoProbe;
    class QVideoWidget;
    class QAudioProbe;
    class QStandardItemModel;
    
    
    class coreplayer : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit coreplayer(QWidget *parent = 0);
        ~coreplayer();
    
        void openPlayer(const QString path);
    
        bool isPlayerAvailable() const;
        QMediaPlayer::State state() const;
    
    protected:
        void closeEvent(QCloseEvent *event);
    
    public slots:
        void setState(QMediaPlayer::State state);
    
    private:
        Ui::coreplayer *ui;
    
        QStringList getAudios(const QString path);
        QStringList getVideos(const QString path);
        QStringList videomimes;
        QStringList audiomimes;
    
        void audioMimes();
        void videoMimes();
        void setTrackInfo(const QString &info);
        void setStatusInfo(const QString &info);
        void handleCursor(QMediaPlayer::MediaStatus status);
        void updateDurationInfo(qint64 currentInfo);
        void setFolder(const QString &foldername);
        void play(int index);
        void setCurrentIndex(int currentIndex);
        void shotcuts();
    
        int mNumberOfFiles;
        QMediaPlayer::State playerState;
        QMediaPlayer *player;
        QVideoProbe *videoProbe;
        QAudioProbe *audioProbe;
        QAbstractItemView *medialist;
        qint64 duration;
        QStandardItemModel *mModel;
    
    private slots:
        void seekLeft();
        void seekRight();
        void volumnUP();
        void volumnDown();
    
        void durationChanged(qint64 duration);
        void positionChanged(qint64 progress);
        void seek(int seconds);
        void statusChanged(QMediaPlayer::MediaStatus status);
        void bufferingProgress(int progress);
        void displayErrorMessage();
    
        void on_open_clicked();
        void on_previous_clicked();
        void on_play_clicked(bool checked);
        void on_mute_clicked(bool checked);
        void on_volume_valueChanged(int value);
        void on_stop_clicked();
        void on_next_clicked();
        void on_medialist_doubleClicked(const QModelIndex &index);
        void on_playlist_clicked(bool checked);
    };
    
    #endif // COREPLAYER_H
    
    

    here is the ui

    0_1526796754092_t.png

    here is the problems

    0 - after stop clicked player widget turns to white color
    0 - after stop ,play button dose not work .
    0 - while playing it refresh the video widget every frame or second.

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi
      set break points in start and stop
      single step the code and see what happens.
      Its the best way to find out why logic does not work.

      1 Reply Last reply
      2
      • S Offline
        S Offline
        saber
        wrote on last edited by
        #3

        ok . i found the problem for "after stop ,play button dose not work "
        ui->medialist->currentIndex().row() this giving -1 that's why .

        here is the fix

        void coreplayer::on_play_clicked(bool checked)
        {
            if (checked ){
                setState(QMediaPlayer::PlayingState);
                player->play();
                if(ui->medialist->currentIndex().row() != -1){play(ui->medialist->currentIndex().row());}
                else{play(0);}
                if(ui->shortcut->isVisible()){ui->shortcut->setVisible(false);}
                messageEngine("Playing", "Info");
            }
            else if (!checked){
                setState(QMediaPlayer::PausedState);
                player->pause();
                messageEngine("Paused", "Info");
            }
        }
        

        @mrjj any fix for the first and the third one ??

        mrjjM 1 Reply Last reply
        0
        • S saber

          ok . i found the problem for "after stop ,play button dose not work "
          ui->medialist->currentIndex().row() this giving -1 that's why .

          here is the fix

          void coreplayer::on_play_clicked(bool checked)
          {
              if (checked ){
                  setState(QMediaPlayer::PlayingState);
                  player->play();
                  if(ui->medialist->currentIndex().row() != -1){play(ui->medialist->currentIndex().row());}
                  else{play(0);}
                  if(ui->shortcut->isVisible()){ui->shortcut->setVisible(false);}
                  messageEngine("Playing", "Info");
              }
              else if (!checked){
                  setState(QMediaPlayer::PausedState);
                  player->pause();
                  messageEngine("Paused", "Info");
              }
          }
          

          @mrjj any fix for the first and the third one ??

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @saber
          Im not really sure what turns to white means. Is it still alive ?

          • 0 - while playing it refresh the video widget every frame or second.
            refreshes in what way ? Dont it play by itself?
          S 1 Reply Last reply
          0
          • mrjjM mrjj

            @saber
            Im not really sure what turns to white means. Is it still alive ?

            • 0 - while playing it refresh the video widget every frame or second.
              refreshes in what way ? Dont it play by itself?
            S Offline
            S Offline
            saber
            wrote on last edited by
            #5

            @mrjj
            when app starts video widget is black.
            when i stop the player, the video widget turns into white.
            pause state
            0_1526807874936_a2.png

            stop state
            0_1526807913139_a1.png

            0 - while playing it refresh the video widget every frame or second.

            means while it's playing the playback flickers . after every second videowidget shows a white page , like second picture.

            mrjjM 1 Reply Last reply
            0
            • S saber

              @mrjj
              when app starts video widget is black.
              when i stop the player, the video widget turns into white.
              pause state
              0_1526807874936_a2.png

              stop state
              0_1526807913139_a1.png

              0 - while playing it refresh the video widget every frame or second.

              means while it's playing the playback flickers . after every second videowidget shows a white page , like second picture.

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by mrjj
              #6

              @saber
              Hi
              Did you try a small code sample and play the same video and check if is normal ?
              I have zero idea what the white thing u seen during play back is.

              1 Reply Last reply
              2
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #7

                Hi
                @saber said in help to fix some problem in my QmediaPlayer:

                if (checked ){
                //snip
                }
                else if (!checked){
                //snip
                }

                The second if is useless and even makes your code unclear. else is enough as checked is a boolean value.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                1

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved