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. Media player not working for multiple videos

Media player not working for multiple videos

Scheduled Pinned Locked Moved Solved General and Desktop
qt 5.5videosurfacemedia playergraphicview
41 Posts 8 Posters 15.0k Views 3 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.
  • jsulmJ jsulm

    @Kinesis Please show your code...
    You need to put the code I shown AFTER you created m_playButton.

    K Offline
    K Offline
    Kinesis
    wrote on last edited by
    #29

    @jsulm
    Here is the code

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        
        ui->listWidget->setFlow(QListView::LeftToRight);
        ui->listWidget->setMinimumSize(1200,350);
        ui->listWidget->setGridSize(QSize(360, 360));
        ui->listWidget->setResizeMode(QListView::Adjust);
        ui->listWidget->setViewMode(QListView::ListMode);
        ui->listWidget->setWrapping(true);
        
        QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",
                                                           
                                                           QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
        
        directory.setNameFilters({"*.mp4" , "*.avi" , "*.flv" , "*.mwv"});
        
        for(const QFileInfo & finfo: directory.entryInfoList()){
            QMediaPlayer *mediaPlayer = new QMediaPlayer();
            mediaPlayer->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
            // mediaPlayer->setMedia(playlist);
            videoItem = new QGraphicsVideoItem;
            videoItem->setSize(QSize(320,240));
            QGraphicsScene *scene = new QGraphicsScene(this);
            QGraphicsView *graphicsView = new QGraphicsView(scene);
            
            
            
            
            mediaPlayer->setVideoOutput(videoItem);
            player.append(mediaPlayer);
            scene->addItem(videoItem);
            
            connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &MainWindow::mediaStateChanged);
            
            connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &MainWindow::positionChanged);
            connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &MainWindow::durationChanged);
            
            m_playButton = new QPushButton;
            m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            
            connect(m_playButton, &QAbstractButton::clicked, [mediaPlayer]() {
                switch (mediaPlayer->state()) {
                case QMediaPlayer::PlayingState:
                    mediaPlayer->pause();
                    break;
                default:
                    mediaPlayer->play();
                    break;
                }
            });
            
            connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state) {
                switch(state) {
                case QMediaPlayer::PlayingState:
                    m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
                    break;
                default:
                    m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
                    break;
                }
            });
            
            
            //connect(m_playButton, &QAbstractButton::clicked, this, &MainWindow::play);
            //connect(m_positionSlider, &QAbstractSlider::sliderMoved,this, &MainWindow::setPosition);
            
            
            
            m_positionSlider = new QSlider(Qt::Horizontal);
            m_positionSlider->setRange(0, 0);
            
            
            auto    item = new QListWidgetItem("", ui->listWidget);
            auto    widget = new QWidget;
            auto    label = new QLabel(finfo.fileName());
            auto    vb = new QVBoxLayout;
            
            QBoxLayout *controlLayout = new QHBoxLayout;
            controlLayout->setMargin(0);
            controlLayout->addWidget(m_playButton);
            controlLayout->addWidget(m_positionSlider);
            
            vb->addWidget(label,1);
            vb->addWidget(graphicsView,9);
            vb->addLayout(controlLayout);
            widget->setLayout(vb);
            widget->setMinimumSize(340, 340);
            ui->listWidget->setItemWidget(item,widget);
            
            
        }
            
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    QSize MainWindow::sizeHint() const
    {
        return (videoItem->size() * qreal(3) / qreal(2)).toSize();
    }
    
    void MainWindow::positionChanged(qint64 position)
    {
        m_positionSlider->setValue(position);
    }
    
    void MainWindow::durationChanged(qint64 duration)
    {
        m_positionSlider->setRange(0, duration);
    }
    
    void MainWindow::setPosition(int position)
    {
        QMediaPlayer *mediaPlayer = player[1];
        mediaPlayer->setPosition(position);
    }
    
    jsulmJ D 2 Replies Last reply
    0
    • K Kinesis

      @jsulm
      Here is the code

      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent),
          ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
          
          ui->listWidget->setFlow(QListView::LeftToRight);
          ui->listWidget->setMinimumSize(1200,350);
          ui->listWidget->setGridSize(QSize(360, 360));
          ui->listWidget->setResizeMode(QListView::Adjust);
          ui->listWidget->setViewMode(QListView::ListMode);
          ui->listWidget->setWrapping(true);
          
          QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",
                                                             
                                                             QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
          
          directory.setNameFilters({"*.mp4" , "*.avi" , "*.flv" , "*.mwv"});
          
          for(const QFileInfo & finfo: directory.entryInfoList()){
              QMediaPlayer *mediaPlayer = new QMediaPlayer();
              mediaPlayer->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
              // mediaPlayer->setMedia(playlist);
              videoItem = new QGraphicsVideoItem;
              videoItem->setSize(QSize(320,240));
              QGraphicsScene *scene = new QGraphicsScene(this);
              QGraphicsView *graphicsView = new QGraphicsView(scene);
              
              
              
              
              mediaPlayer->setVideoOutput(videoItem);
              player.append(mediaPlayer);
              scene->addItem(videoItem);
              
              connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &MainWindow::mediaStateChanged);
              
              connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &MainWindow::positionChanged);
              connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &MainWindow::durationChanged);
              
              m_playButton = new QPushButton;
              m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
              
              connect(m_playButton, &QAbstractButton::clicked, [mediaPlayer]() {
                  switch (mediaPlayer->state()) {
                  case QMediaPlayer::PlayingState:
                      mediaPlayer->pause();
                      break;
                  default:
                      mediaPlayer->play();
                      break;
                  }
              });
              
              connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state) {
                  switch(state) {
                  case QMediaPlayer::PlayingState:
                      m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
                      break;
                  default:
                      m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
                      break;
                  }
              });
              
              
              //connect(m_playButton, &QAbstractButton::clicked, this, &MainWindow::play);
              //connect(m_positionSlider, &QAbstractSlider::sliderMoved,this, &MainWindow::setPosition);
              
              
              
              m_positionSlider = new QSlider(Qt::Horizontal);
              m_positionSlider->setRange(0, 0);
              
              
              auto    item = new QListWidgetItem("", ui->listWidget);
              auto    widget = new QWidget;
              auto    label = new QLabel(finfo.fileName());
              auto    vb = new QVBoxLayout;
              
              QBoxLayout *controlLayout = new QHBoxLayout;
              controlLayout->setMargin(0);
              controlLayout->addWidget(m_playButton);
              controlLayout->addWidget(m_positionSlider);
              
              vb->addWidget(label,1);
              vb->addWidget(graphicsView,9);
              vb->addLayout(controlLayout);
              widget->setLayout(vb);
              widget->setMinimumSize(340, 340);
              ui->listWidget->setItemWidget(item,widget);
              
              
          }
              
      }
      MainWindow::~MainWindow()
      {
          delete ui;
      }
      QSize MainWindow::sizeHint() const
      {
          return (videoItem->size() * qreal(3) / qreal(2)).toSize();
      }
      
      void MainWindow::positionChanged(qint64 position)
      {
          m_positionSlider->setValue(position);
      }
      
      void MainWindow::durationChanged(qint64 duration)
      {
          m_positionSlider->setRange(0, duration);
      }
      
      void MainWindow::setPosition(int position)
      {
          QMediaPlayer *mediaPlayer = player[1];
          mediaPlayer->setPosition(position);
      }
      
      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #30

      @Kinesis And exactly this code does not build?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • K Kinesis

        @jsulm
        Here is the code

        MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
            
            ui->listWidget->setFlow(QListView::LeftToRight);
            ui->listWidget->setMinimumSize(1200,350);
            ui->listWidget->setGridSize(QSize(360, 360));
            ui->listWidget->setResizeMode(QListView::Adjust);
            ui->listWidget->setViewMode(QListView::ListMode);
            ui->listWidget->setWrapping(true);
            
            QDir directory = QFileDialog::getExistingDirectory(this, tr("Open Directory"),"/home",
                                                               
                                                               QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);
            
            directory.setNameFilters({"*.mp4" , "*.avi" , "*.flv" , "*.mwv"});
            
            for(const QFileInfo & finfo: directory.entryInfoList()){
                QMediaPlayer *mediaPlayer = new QMediaPlayer();
                mediaPlayer->setMedia(QUrl::fromLocalFile(finfo.absoluteFilePath()));
                // mediaPlayer->setMedia(playlist);
                videoItem = new QGraphicsVideoItem;
                videoItem->setSize(QSize(320,240));
                QGraphicsScene *scene = new QGraphicsScene(this);
                QGraphicsView *graphicsView = new QGraphicsView(scene);
                
                
                
                
                mediaPlayer->setVideoOutput(videoItem);
                player.append(mediaPlayer);
                scene->addItem(videoItem);
                
                connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &MainWindow::mediaStateChanged);
                
                connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &MainWindow::positionChanged);
                connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &MainWindow::durationChanged);
                
                m_playButton = new QPushButton;
                m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
                
                connect(m_playButton, &QAbstractButton::clicked, [mediaPlayer]() {
                    switch (mediaPlayer->state()) {
                    case QMediaPlayer::PlayingState:
                        mediaPlayer->pause();
                        break;
                    default:
                        mediaPlayer->play();
                        break;
                    }
                });
                
                connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state) {
                    switch(state) {
                    case QMediaPlayer::PlayingState:
                        m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
                        break;
                    default:
                        m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
                        break;
                    }
                });
                
                
                //connect(m_playButton, &QAbstractButton::clicked, this, &MainWindow::play);
                //connect(m_positionSlider, &QAbstractSlider::sliderMoved,this, &MainWindow::setPosition);
                
                
                
                m_positionSlider = new QSlider(Qt::Horizontal);
                m_positionSlider->setRange(0, 0);
                
                
                auto    item = new QListWidgetItem("", ui->listWidget);
                auto    widget = new QWidget;
                auto    label = new QLabel(finfo.fileName());
                auto    vb = new QVBoxLayout;
                
                QBoxLayout *controlLayout = new QHBoxLayout;
                controlLayout->setMargin(0);
                controlLayout->addWidget(m_playButton);
                controlLayout->addWidget(m_positionSlider);
                
                vb->addWidget(label,1);
                vb->addWidget(graphicsView,9);
                vb->addLayout(controlLayout);
                widget->setLayout(vb);
                widget->setMinimumSize(340, 340);
                ui->listWidget->setItemWidget(item,widget);
                
                
            }
                
        }
        MainWindow::~MainWindow()
        {
            delete ui;
        }
        QSize MainWindow::sizeHint() const
        {
            return (videoItem->size() * qreal(3) / qreal(2)).toSize();
        }
        
        void MainWindow::positionChanged(qint64 position)
        {
            m_positionSlider->setValue(position);
        }
        
        void MainWindow::durationChanged(qint64 duration)
        {
            m_positionSlider->setRange(0, duration);
        }
        
        void MainWindow::setPosition(int position)
        {
            QMediaPlayer *mediaPlayer = player[1];
            mediaPlayer->setPosition(position);
        }
        
        D Offline
        D Offline
        Devopia53
        wrote on last edited by
        #31

        @Kinesis

        Declare QPushButton as a local variable like a mediaPlayer. A lambda function can not capture member variables of this.

        aha_1980A 1 Reply Last reply
        0
        • D Devopia53

          @Kinesis

          Declare QPushButton as a local variable like a mediaPlayer. A lambda function can not capture member variables of this.

          aha_1980A Offline
          aha_1980A Offline
          aha_1980
          Lifetime Qt Champion
          wrote on last edited by
          #32

          @Devopia53 No, it can:

          auto l = [this]() {
            // use members of this here
          }
          

          Qt has to stay free or it will die.

          D 1 Reply Last reply
          0
          • K Offline
            K Offline
            Kinesis
            wrote on last edited by Kinesis
            #33

            @jsulm - Yes it does not work
            @Devopia53 - When I declare local variable , it works.
            @aha_1980 - I will also try like U said .
            Sorry for replying in the same reply . Because I am a new user . I can only post per every 600s

            1 Reply Last reply
            0
            • K Offline
              K Offline
              Kinesis
              wrote on last edited by Kinesis
              #34

              I still have a question . I replaced the slider slots into loop but I can't control the sliders and sliders are not moving when the videos are running .
              Here is the slider code

              QSlider *m_positionSlider = new QSlider(Qt::Horizontal);
                      m_positionSlider->setRange(0, 0);
              
                     
                      connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
              
                          m_positionSlider->setValue(position);
                      });
              
                      connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
              
                          m_positionSlider->setRange(0,duration);
                      });
              
              
                      connect(mediaPlayer , &QMediaPlayer::setPosition, [mediaPlayer ,this] (int position){
              
                          mediaPlayer->setPosition(position);
                      });
              
              
              jsulmJ 1 Reply Last reply
              0
              • K Kinesis

                I still have a question . I replaced the slider slots into loop but I can't control the sliders and sliders are not moving when the videos are running .
                Here is the slider code

                QSlider *m_positionSlider = new QSlider(Qt::Horizontal);
                        m_positionSlider->setRange(0, 0);
                
                       
                        connect(mediaPlayer, &QMediaPlayer::positionChanged ,[m_positionSlider, this](qint64 position){
                
                            m_positionSlider->setValue(position);
                        });
                
                        connect(mediaPlayer, &QMediaPlayer::durationChanged ,[m_positionSlider, this](qint64 duration){
                
                            m_positionSlider->setRange(0,duration);
                        });
                
                
                        connect(mediaPlayer , &QMediaPlayer::setPosition, [mediaPlayer ,this] (int position){
                
                            mediaPlayer->setPosition(position);
                        });
                
                
                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by jsulm
                #35

                @Kinesis What is this:

                connect(mediaPlayer , &QMediaPlayer::setPosition, [mediaPlayer ,this] (int position){
                
                            mediaPlayer->setPosition(position);
                        });
                

                ?
                QMediaPlayer::setPosition() is a slot not a signal.
                I think you need to change the range

                m_positionSlider->setRange(0, 0);
                

                You can use http://doc.qt.io/qt-5/qmediaplayer.html#duration-prop to set the range.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                K 1 Reply Last reply
                1
                • aha_1980A aha_1980

                  @Devopia53 No, it can:

                  auto l = [this]() {
                    // use members of this here
                  }
                  
                  D Offline
                  D Offline
                  Devopia53
                  wrote on last edited by Devopia53
                  #36

                  @aha_1980

                  I know that well(as [&] or [=]). But what I have described is that you have captured the member variables of the this object directly. Take a look at his source code. here: connect(mediaPlayer, &QMediaPlayer::stateChanged, [m_playButton, this](QMediaPlayer::State state)
                  A m_playButton is a member of the this.

                  1 Reply Last reply
                  1
                  • jsulmJ jsulm

                    @Kinesis What is this:

                    connect(mediaPlayer , &QMediaPlayer::setPosition, [mediaPlayer ,this] (int position){
                    
                                mediaPlayer->setPosition(position);
                            });
                    

                    ?
                    QMediaPlayer::setPosition() is a slot not a signal.
                    I think you need to change the range

                    m_positionSlider->setRange(0, 0);
                    

                    You can use http://doc.qt.io/qt-5/qmediaplayer.html#duration-prop to set the range.

                    K Offline
                    K Offline
                    Kinesis
                    wrote on last edited by
                    #37

                    @jsulm
                    Thanks for your suggestion . Now the slider is running along with video.But to use it like skip slider how should I correct this "QMediaPlayer::setPosition() " which is a slot but not a signal ?By the way , sorry for late response .

                    jsulmJ 1 Reply Last reply
                    0
                    • K Kinesis

                      @jsulm
                      Thanks for your suggestion . Now the slider is running along with video.But to use it like skip slider how should I correct this "QMediaPlayer::setPosition() " which is a slot but not a signal ?By the way , sorry for late response .

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #38

                      @Kinesis You don't need

                      connect(mediaPlayer , &QMediaPlayer::setPosition, [mediaPlayer ,this] (int position){
                      
                                  mediaPlayer->setPosition(position);
                              });
                      

                      You're already using QMediaPlayer::positionChanged...

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      K 1 Reply Last reply
                      0
                      • jsulmJ jsulm

                        @Kinesis You don't need

                        connect(mediaPlayer , &QMediaPlayer::setPosition, [mediaPlayer ,this] (int position){
                        
                                    mediaPlayer->setPosition(position);
                                });
                        

                        You're already using QMediaPlayer::positionChanged...

                        K Offline
                        K Offline
                        Kinesis
                        wrote on last edited by
                        #39

                        @jsulm
                        I got this. It's done now. My code is working fully 100% now . Thanks a lot for helping me . I fell bad that I wasted your time . By the way should I upload my
                        code ? It might help someone . Thanks.

                        jsulmJ 1 Reply Last reply
                        1
                        • K Kinesis

                          @jsulm
                          I got this. It's done now. My code is working fully 100% now . Thanks a lot for helping me . I fell bad that I wasted your time . By the way should I upload my
                          code ? It might help someone . Thanks.

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #40

                          @Kinesis No need to feel bad - I'm helping here voluntary :-)
                          I don't think you need to upload your code. If somebody has questions he/she can ask.

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          2
                          • W Offline
                            W Offline
                            WoodyLanes
                            Banned
                            wrote on last edited by WoodyLanes
                            #41
                            This post is deleted!
                            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