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. [QT5.13.1 on Windows] QMediaPlayer's setMedia() API giving error 5 i.e. QMediaPlayer::ServiceMissingError
Forum Updated to NodeBB v4.3 + New Features

[QT5.13.1 on Windows] QMediaPlayer's setMedia() API giving error 5 i.e. QMediaPlayer::ServiceMissingError

Scheduled Pinned Locked Moved Unsolved General and Desktop
2 Posts 2 Posters 270 Views 1 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.
  • R Offline
    R Offline
    RkTest
    wrote on last edited by RkTest
    #1

    Our is a C++ on windows GUI project which we build using visual studio 2017. For GUI we use QT 5. We dont use qt creator. In one of the widget I have to play a video using QT for which I am trying to use QMediaPlayer. I took a code snippet from the documentation. In the gui we select a file and then click on the play button which is supposed to play the video.

    After the call to API setMedia() we see a mediaplayer error 5 i.e. QMediaPlayer::ServiceMissingError. What service is the qt API looking for?

    How to play the video using qt api in this c++ windows code?

    void signalWidget::handleError()
    {
        m_playButton->setEnabled(false);
        const QString errorString = m_mediaPlayer->errorString();
        QString message = "Error: ";
        if (errorString.isEmpty())
            message += " #" + QString::number(int(m_mediaPlayer->error()));
        else
            message += errorString;
        m_errorLabel->setText(message);
    
        std::cout << " ERROR = " << message.toStdString() << "\n";
    }
    
    void signalWidget::positionChanged(qint64 position)
    {
    std::cout << " position = " << position << "\n";
        m_positionSlider->setValue(position);
    }
    
    void signalWidget::durationChanged(qint64 duration)
    {
    std::cout << " duration = " << duration << "\n";
        m_positionSlider->setRange(0, duration);
    }
    
    void signalWidget::setPosition(int position)
    {
    std::cout << " position = " << position << "\n";
        m_mediaPlayer->setPosition(position);
    }
    
    void signalWidget::mediaStateChanged(QMediaPlayer::State state)
    {
        std::cout << " state = " << state << "\n";
        switch(state) {
        case QMediaPlayer::PlayingState:
            m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
            break;
        default:
            m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            break;
        }
    }
    
     void signalWidget::MediaError(QMediaPlayer::Error error)
     {
      std::cout << " Media Error: " << error << "\n";
     }
    
     void signalWidget::ChangedStatus(QMediaPlayer::MediaStatus status)
     {
      std::cout << " Status changed to: " << status << "\n";
     }
    
    void signalWidget::play()
    {
    std::cout << " currentMedia = " << m_mediaPlayer->currentMedia().canonicalUrl().toString().toStdString() << 
                                                        ", playerState = " << m_mediaPlayer->state() << "   E\n";
    
        switch (m_mediaPlayer->state()) {
        case QMediaPlayer::PlayingState:
            m_mediaPlayer->pause();
            break;
        default:
            m_mediaPlayer->play();
            break;
        }
    
        std::cout << " playerState = " << m_mediaPlayer->state() << ", playerMediaState = " << m_mediaPlayer->mediaStatus() << "\n";
    }
    
    void signalWidget::setUrl(const QUrl &url)
    {
        m_errorLabel->setText(QString());
        setWindowFilePath(url.isLocalFile() ? url.toLocalFile() : QString());
        **m_mediaPlayer->setMedia(url);**
        m_playButton->setEnabled(true);
    std::cout << " currentMedia = " << m_mediaPlayer->currentMedia().canonicalUrl().toString().toStdString() << 
                                                        ", player State = " << m_mediaPlayer->state() <<
                                                        ", player ERROR = " << m_mediaPlayer->error();
    
    }
    
    void signalWidget::openFile()
    {
        QFileDialog fileDialog(this);
        fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
        fileDialog.setWindowTitle(tr("Open Movie"));
        QStringList supportedMimeTypes = m_mediaPlayer->supportedMimeTypes();
        if (!supportedMimeTypes.isEmpty())
            fileDialog.setMimeTypeFilters(supportedMimeTypes);
        fileDialog.setDirectory(QStandardPaths::standardLocations(QStandardPaths::MoviesLocation).value(0, QDir::homePath()));
        if (fileDialog.exec() == QDialog::Accepted)
            setUrl(fileDialog.selectedUrls().constFirst());
    }
    
    

    The above code is called as:

    
    
    signalWidget::signalWidget(int widget_id)
    {
            m_mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
            videoWidget = new QVideoWidget;
        
            QAbstractButton *openButton = new QPushButton(tr("Open..."));
            connect(openButton,SIGNAL(clicked()),this,SLOT(openFile()));
    
            m_playButton = new QPushButton;
            m_playButton->setEnabled(false);
            m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            connect(m_playButton, SIGNAL(clicked()), this, SLOT(play()));
    
            m_positionSlider = new QSlider(Qt::Horizontal);
            m_positionSlider->setRange(0, 0);
            connect(m_positionSlider, SIGNAL(sliderMoved()), this, SLOT(setPosition()));
    
            m_errorLabel = new QLabel;
            m_errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
    
            m_errorLabel->setAutoFillBackground(true); // IMPORTANT!
            m_errorLabel->setStyleSheet("QLabel { background-color : pink; color : blue; }");
    
            QBoxLayout *controlLayout = new QHBoxLayout;
            controlLayout->setMargin(0);
            controlLayout->addWidget(openButton);
            controlLayout->addWidget(m_playButton);
            controlLayout->addWidget(m_positionSlider);
    
            QBoxLayout *layout = new QVBoxLayout;
            layout->addWidget(videoWidget);
            layout->addLayout(controlLayout);
            layout->addWidget(m_errorLabel);
            layout->setMargin(0); //! to avoid wasting spaces with margins
            setLayout(layout);
    
            m_mediaPlayer->setVideoOutput(videoWidget);
            connect(m_mediaPlayer, SIGNAL(stateChanged()), this, SLOT(mediaStateChanged()));
            connect(m_mediaPlayer, SIGNAL(positionChanged()), this, SLOT(mediaStateChanged()));
            connect(m_mediaPlayer, SIGNAL(durationChanged()), this, SLOT(durationChanged()));
            connect(m_mediaPlayer, SIGNAL(Error()), this, SLOT(handleError()));
    
    }
    
    Axel SpoerlA 1 Reply Last reply
    0
    • R RkTest

      Our is a C++ on windows GUI project which we build using visual studio 2017. For GUI we use QT 5. We dont use qt creator. In one of the widget I have to play a video using QT for which I am trying to use QMediaPlayer. I took a code snippet from the documentation. In the gui we select a file and then click on the play button which is supposed to play the video.

      After the call to API setMedia() we see a mediaplayer error 5 i.e. QMediaPlayer::ServiceMissingError. What service is the qt API looking for?

      How to play the video using qt api in this c++ windows code?

      void signalWidget::handleError()
      {
          m_playButton->setEnabled(false);
          const QString errorString = m_mediaPlayer->errorString();
          QString message = "Error: ";
          if (errorString.isEmpty())
              message += " #" + QString::number(int(m_mediaPlayer->error()));
          else
              message += errorString;
          m_errorLabel->setText(message);
      
          std::cout << " ERROR = " << message.toStdString() << "\n";
      }
      
      void signalWidget::positionChanged(qint64 position)
      {
      std::cout << " position = " << position << "\n";
          m_positionSlider->setValue(position);
      }
      
      void signalWidget::durationChanged(qint64 duration)
      {
      std::cout << " duration = " << duration << "\n";
          m_positionSlider->setRange(0, duration);
      }
      
      void signalWidget::setPosition(int position)
      {
      std::cout << " position = " << position << "\n";
          m_mediaPlayer->setPosition(position);
      }
      
      void signalWidget::mediaStateChanged(QMediaPlayer::State state)
      {
          std::cout << " state = " << state << "\n";
          switch(state) {
          case QMediaPlayer::PlayingState:
              m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
              break;
          default:
              m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
              break;
          }
      }
      
       void signalWidget::MediaError(QMediaPlayer::Error error)
       {
        std::cout << " Media Error: " << error << "\n";
       }
      
       void signalWidget::ChangedStatus(QMediaPlayer::MediaStatus status)
       {
        std::cout << " Status changed to: " << status << "\n";
       }
      
      void signalWidget::play()
      {
      std::cout << " currentMedia = " << m_mediaPlayer->currentMedia().canonicalUrl().toString().toStdString() << 
                                                          ", playerState = " << m_mediaPlayer->state() << "   E\n";
      
          switch (m_mediaPlayer->state()) {
          case QMediaPlayer::PlayingState:
              m_mediaPlayer->pause();
              break;
          default:
              m_mediaPlayer->play();
              break;
          }
      
          std::cout << " playerState = " << m_mediaPlayer->state() << ", playerMediaState = " << m_mediaPlayer->mediaStatus() << "\n";
      }
      
      void signalWidget::setUrl(const QUrl &url)
      {
          m_errorLabel->setText(QString());
          setWindowFilePath(url.isLocalFile() ? url.toLocalFile() : QString());
          **m_mediaPlayer->setMedia(url);**
          m_playButton->setEnabled(true);
      std::cout << " currentMedia = " << m_mediaPlayer->currentMedia().canonicalUrl().toString().toStdString() << 
                                                          ", player State = " << m_mediaPlayer->state() <<
                                                          ", player ERROR = " << m_mediaPlayer->error();
      
      }
      
      void signalWidget::openFile()
      {
          QFileDialog fileDialog(this);
          fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
          fileDialog.setWindowTitle(tr("Open Movie"));
          QStringList supportedMimeTypes = m_mediaPlayer->supportedMimeTypes();
          if (!supportedMimeTypes.isEmpty())
              fileDialog.setMimeTypeFilters(supportedMimeTypes);
          fileDialog.setDirectory(QStandardPaths::standardLocations(QStandardPaths::MoviesLocation).value(0, QDir::homePath()));
          if (fileDialog.exec() == QDialog::Accepted)
              setUrl(fileDialog.selectedUrls().constFirst());
      }
      
      

      The above code is called as:

      
      
      signalWidget::signalWidget(int widget_id)
      {
              m_mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
              videoWidget = new QVideoWidget;
          
              QAbstractButton *openButton = new QPushButton(tr("Open..."));
              connect(openButton,SIGNAL(clicked()),this,SLOT(openFile()));
      
              m_playButton = new QPushButton;
              m_playButton->setEnabled(false);
              m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
              connect(m_playButton, SIGNAL(clicked()), this, SLOT(play()));
      
              m_positionSlider = new QSlider(Qt::Horizontal);
              m_positionSlider->setRange(0, 0);
              connect(m_positionSlider, SIGNAL(sliderMoved()), this, SLOT(setPosition()));
      
              m_errorLabel = new QLabel;
              m_errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
      
              m_errorLabel->setAutoFillBackground(true); // IMPORTANT!
              m_errorLabel->setStyleSheet("QLabel { background-color : pink; color : blue; }");
      
              QBoxLayout *controlLayout = new QHBoxLayout;
              controlLayout->setMargin(0);
              controlLayout->addWidget(openButton);
              controlLayout->addWidget(m_playButton);
              controlLayout->addWidget(m_positionSlider);
      
              QBoxLayout *layout = new QVBoxLayout;
              layout->addWidget(videoWidget);
              layout->addLayout(controlLayout);
              layout->addWidget(m_errorLabel);
              layout->setMargin(0); //! to avoid wasting spaces with margins
              setLayout(layout);
      
              m_mediaPlayer->setVideoOutput(videoWidget);
              connect(m_mediaPlayer, SIGNAL(stateChanged()), this, SLOT(mediaStateChanged()));
              connect(m_mediaPlayer, SIGNAL(positionChanged()), this, SLOT(mediaStateChanged()));
              connect(m_mediaPlayer, SIGNAL(durationChanged()), this, SLOT(durationChanged()));
              connect(m_mediaPlayer, SIGNAL(Error()), this, SLOT(handleError()));
      
      }
      
      Axel SpoerlA Offline
      Axel SpoerlA Offline
      Axel Spoerl
      Moderators
      wrote on last edited by
      #2

      @RkTest
      Qt 5.13.1 is out of support. Pls try with a more recent Qt version (>= 6.2)

      Software Engineer
      The Qt Company, Oslo

      1 Reply Last reply
      0

      • Login

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