Skip to content

Commit 7974e2e

Browse files
committed
Added duration label (in msec). Working with .m4v files on macOS
1 parent 1b19db4 commit 7974e2e

2 files changed

Lines changed: 112 additions & 29 deletions

File tree

src/videoplayer.cpp

Lines changed: 103 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,69 @@
66
#include <QVideoWidget>
77
#include <qvideowidget.h>
88
#include <qvideosurfaceformat.h>
9+
#include <QMediaMetaData>
10+
11+
//currentMediaChanged(const QMediaContent &media)
12+
913

1014
VideoPlayer::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

5474
VideoPlayer::~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+
114168
void VideoPlayer::positionChanged(qint64 position)
115169
{
116170
m_positionSlider->setValue(position);
171+
this->updatePositionDurationLabel();
117172
}
118173

119174
void VideoPlayer::durationChanged(qint64 duration)
120175
{
121176
m_positionSlider->setRange(0, duration);
177+
this->updatePositionDurationLabel();
122178
}
123179

124180
qint64 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+
134195
void 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

139213
void VideoPlayer::handleError()

src/videoplayer.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ class VideoPlayer : public QWidget
2121
void setUrl(const QUrl &url);
2222
qint64 getDuration();
2323
qint64 getPosition();
24+
qreal getFramesPerSecond();
25+
void getMetaData();
2426

2527
public slots:
2628
void openFile();
2729
void play();
2830

2931
private slots:
32+
void onMediaStatusChanged(QMediaPlayer::MediaStatus status);
3033
void mediaStateChanged(QMediaPlayer::State state);
3134
void positionChanged(qint64 position);
3235
void durationChanged(qint64 duration);
@@ -38,6 +41,12 @@ class VideoPlayer : public QWidget
3841
QAbstractButton *m_playButton;
3942
QSlider *m_positionSlider;
4043
QLabel *m_errorLabel;
44+
QLabel *m_positionLabel;
45+
QAbstractButton *m_showPositionInDataFileButton;
46+
47+
qreal videoFrameRate = 0;
48+
49+
void updatePositionDurationLabel();
4150

4251

4352
};

0 commit comments

Comments
 (0)