66#include < QVideoWidget>
77#include < qvideowidget.h>
88#include < qvideosurfaceformat.h>
9+ #include < QMediaMetaData>
10+
11+ // currentMediaChanged(const QMediaContent &media)
12+
913
1014VideoPlayer::VideoPlayer (QWidget *parent) : QWidget(parent)
1115{
1216 m_mediaPlayer = new QMediaPlayer (this , QMediaPlayer::VideoSurface);
13- QVideoWidget *videoWidget = new QVideoWidget;
17+ QVideoWidget *videoWidget = new QVideoWidget;
18+
19+ QAbstractButton *openButton = new QPushButton (tr (" Open..." ));
20+ connect (openButton, &QAbstractButton::clicked, this , &VideoPlayer::openFile);
21+
22+ m_playButton = new QPushButton;
23+ m_playButton->setEnabled (false );
24+ m_playButton->setIcon (style ()->standardIcon (QStyle::SP_MediaPlay));
25+
26+ connect (m_playButton, &QAbstractButton::clicked,
27+ this , &VideoPlayer::play);
1428
15- QAbstractButton *openButton = new QPushButton ( tr ( " Open... " ) );
16- connect (openButton, &QAbstractButton::clicked, this , &VideoPlayer::openFile );
29+ m_positionSlider = new QSlider (Qt::Horizontal );
30+ m_positionSlider-> setRange ( 0 , 0 );
1731
18- m_playButton = new QPushButton;
19- m_playButton->setEnabled (false );
20- m_playButton->setIcon (style ()->standardIcon (QStyle::SP_MediaPlay));
32+ connect (m_positionSlider, &QAbstractSlider::sliderMoved,
33+ this , &VideoPlayer::setPosition);
2134
22- connect (m_playButton, &QAbstractButton::clicked,
23- this , &VideoPlayer::play);
2435
25- m_positionSlider = new QSlider (Qt::Horizontal) ;
26- m_positionSlider-> setRange ( 0 , 0 );
36+ m_positionLabel = new QLabel ;
37+ m_positionLabel-> setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Preferred );
2738
28- connect (m_positionSlider, &QAbstractSlider::sliderMoved,
29- this , &VideoPlayer::setPosition);
39+ m_showPositionInDataFileButton = new QPushButton (tr (" Sync Data File" ));
40+ m_showPositionInDataFileButton->setEnabled (false );
41+ // connect(openButton, &QAbstractButton::clicked, this, &VideoPlayer::openFile);
3042
31- m_errorLabel = new QLabel;
32- m_errorLabel->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Maximum);
43+ m_errorLabel = new QLabel;
44+ m_errorLabel->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Maximum);
3345
34- QBoxLayout *controlLayout = new QHBoxLayout;
35- controlLayout->setMargin (0 );
36- controlLayout->addWidget (openButton);
37- controlLayout->addWidget (m_playButton);
38- controlLayout->addWidget (m_positionSlider);
46+ QBoxLayout *controlLayout = new QHBoxLayout;
47+ controlLayout->setMargin (0 );
48+ // controlLayout->addWidget(openButton);
49+ controlLayout->addWidget (m_playButton);
50+ controlLayout->addWidget (m_positionSlider);
3951
40- QBoxLayout *layout = new QVBoxLayout;
41- layout->addWidget (videoWidget);
42- layout->addLayout (controlLayout);
43- layout->addWidget (m_errorLabel);
52+ QBoxLayout *secondaryControlsLayout = new QHBoxLayout;
53+ secondaryControlsLayout->setMargin (0 );
54+ secondaryControlsLayout->addWidget (openButton);
55+ secondaryControlsLayout->addWidget (m_positionLabel);
56+ secondaryControlsLayout->addWidget (m_showPositionInDataFileButton);
4457
45- setLayout (layout);
58+ QBoxLayout *layout = new QVBoxLayout;
59+ layout->addWidget (videoWidget);
60+ layout->addLayout (controlLayout);
61+ layout->addLayout (secondaryControlsLayout);
62+ layout->addWidget (m_errorLabel);
4663
47- m_mediaPlayer->setVideoOutput (videoWidget);
48- connect (m_mediaPlayer, &QMediaPlayer::stateChanged, this , &VideoPlayer::mediaStateChanged);
49- connect (m_mediaPlayer, &QMediaPlayer::positionChanged, this , &VideoPlayer::positionChanged);
50- connect (m_mediaPlayer, &QMediaPlayer::durationChanged, this , &VideoPlayer::durationChanged);
51- connect (m_mediaPlayer, QOverload<QMediaPlayer::Error>::of (&QMediaPlayer::error), this , &VideoPlayer::handleError);
64+ setLayout (layout);
65+
66+ m_mediaPlayer->setVideoOutput (videoWidget);
67+ connect (m_mediaPlayer, &QMediaPlayer::stateChanged, this , &VideoPlayer::mediaStateChanged);
68+ connect (m_mediaPlayer, SIGNAL (mediaStatusChanged (QMediaPlayer::MediaStatus)), this , SLOT (onMediaStatusChanged (QMediaPlayer::MediaStatus)));
69+ connect (m_mediaPlayer, &QMediaPlayer::positionChanged, this , &VideoPlayer::positionChanged);
70+ connect (m_mediaPlayer, &QMediaPlayer::durationChanged, this , &VideoPlayer::durationChanged);
71+ connect (m_mediaPlayer, QOverload<QMediaPlayer::Error>::of (&QMediaPlayer::error), this , &VideoPlayer::handleError);
5272}
5373
5474VideoPlayer::~VideoPlayer ()
@@ -111,14 +131,50 @@ void VideoPlayer::mediaStateChanged(QMediaPlayer::State state)
111131 }
112132}
113133
134+ void VideoPlayer::onMediaStatusChanged (QMediaPlayer::MediaStatus status) {
135+ if (status == QMediaPlayer::LoadedMedia) {
136+ this ->videoFrameRate = m_mediaPlayer->metaData (QMediaMetaData::VideoFrameRate).value <qreal>();
137+ }
138+ }
139+
140+ void VideoPlayer::getMetaData () {
141+ // Get the list of keys there is metadata available for
142+ QStringList metadatalist = m_mediaPlayer->availableMetaData ();
143+
144+ // Get the size of the list
145+ int list_size = metadatalist.size ();
146+
147+ // qDebug() << player->isMetaDataAvailable() << list_size;
148+
149+ // Define variables to store metadata key and value
150+ QString metadata_key;
151+ QVariant var_data;
152+
153+ for (int indx = 0 ; indx < list_size; indx++)
154+ {
155+ // Get the key from the list
156+ metadata_key = metadatalist.at (indx);
157+
158+ // Get the value for the key
159+ var_data = m_mediaPlayer->metaData (metadata_key);
160+
161+ qDebug () << metadata_key << var_data.toString ();
162+ }
163+
164+
165+
166+ }
167+
114168void VideoPlayer::positionChanged (qint64 position)
115169{
116170 m_positionSlider->setValue (position);
171+ this ->updatePositionDurationLabel ();
117172}
118173
119174void VideoPlayer::durationChanged (qint64 duration)
120175{
121176 m_positionSlider->setRange (0 , duration);
177+ this ->updatePositionDurationLabel ();
122178}
123179
124180qint64 VideoPlayer::getDuration ()
@@ -131,9 +187,27 @@ qint64 VideoPlayer::getPosition()
131187 return m_mediaPlayer->position ();
132188}
133189
190+
191+ qreal VideoPlayer::getFramesPerSecond () {
192+ return this ->videoFrameRate ;
193+ }
194+
134195void VideoPlayer::setPosition (int position)
135196{
136197 m_mediaPlayer->setPosition (position);
198+ this ->updatePositionDurationLabel ();
199+ }
200+
201+
202+ void VideoPlayer::updatePositionDurationLabel () {
203+ const qint64 currPosition = this ->getPosition ();
204+ const qint64 currDuration = this ->getDuration ();
205+
206+ const QString strPosition = QString::number (currPosition); // actual conversion
207+ const QString strDuration = QString::number (currDuration); // actual conversion
208+
209+ const QString finalOutputString = strPosition + " / " + strDuration;
210+ this ->m_positionLabel ->setText (finalOutputString);
137211}
138212
139213void VideoPlayer::handleError ()
0 commit comments