diff options
author | Doris Verria <doris.verria@qt.io> | 2021-02-15 10:28:53 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-03-02 14:50:16 +0000 |
commit | 4a6b7816b1f11e00063ee6080141be4d77bca9ac (patch) | |
tree | f73ed511fa44773e27c10a47b8517775be4133df | |
parent | 2499b994a77c12a4cd55fd79c83708d18f3d896d (diff) |
Show metadata for audio/video files in player example
Change-Id: I10748df06e9866c3121015c657b579aa27ac4450
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | examples/multimediawidgets/player/player.cpp | 53 | ||||
-rw-r--r-- | examples/multimediawidgets/player/player.h | 5 | ||||
-rw-r--r-- | src/multimedia/qmediametadata.cpp | 61 | ||||
-rw-r--r-- | src/multimedia/qmediametadata.h | 4 |
4 files changed, 119 insertions, 4 deletions
diff --git a/examples/multimediawidgets/player/player.cpp b/examples/multimediawidgets/player/player.cpp index ed04ff75f..60745ffe9 100644 --- a/examples/multimediawidgets/player/player.cpp +++ b/examples/multimediawidgets/player/player.cpp @@ -112,6 +112,26 @@ Player::Player(QWidget *parent) histogramLayout->addWidget(m_videoHistogram, 1); histogramLayout->addWidget(m_audioHistogram, 2); + QLabel *metaDataLabel = new QLabel(tr("Metadata for file:")); + QGridLayout *metaDataLayout = new QGridLayout; + int key = QMediaMetaData::Title; + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 6; j+=2) { + m_metaDataLabels[key] = new QLabel(QMediaMetaData::metaDataKeyToString + (static_cast<QMediaMetaData::Key>(key))); + if (key == QMediaMetaData::ThumbnailImage + || key == QMediaMetaData::CoverArtImage) + m_metaDataFields[key] = new QLabel; + else + m_metaDataFields[key] = new QLineEdit; + m_metaDataLabels[key]->setDisabled(true); + m_metaDataFields[key]->setDisabled(true); + metaDataLayout->addWidget(m_metaDataLabels[key], i, j); + metaDataLayout->addWidget(m_metaDataFields[key], i, j+1); + key++; + } + } + // ### replace by a monitoring outputs once we have them // m_videoProbe = new QVideoProbe(this); // connect(m_videoProbe, &QVideoProbe::videoFrameProbed, m_videoHistogram, &HistogramWidget::processFrame); @@ -179,6 +199,8 @@ Player::Player(QWidget *parent) layout->addLayout(hLayout); layout->addLayout(controlLayout); layout->addLayout(histogramLayout); + layout->addWidget(metaDataLabel); + layout->addLayout(metaDataLayout); #if defined(Q_OS_QNX) // On QNX, the main window doesn't have a title bar (or any other decorations). // Create a status bar for the status information instead. @@ -269,9 +291,33 @@ void Player::metaDataChanged() .arg(metaData.value(QMediaMetaData::AlbumArtist).toString()) .arg(metaData.value(QMediaMetaData::Title).toString())); - if (m_coverLabel) { - QImage cover = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>(); - m_coverLabel->setPixmap(QPixmap::fromImage(cover)); + for (int i = 0; i < QMediaMetaData::NumMetaData; i++) { + if (QLineEdit* field = qobject_cast<QLineEdit*>(m_metaDataFields[i])) + field->clear(); + else if (QLabel* label = qobject_cast<QLabel*>(m_metaDataFields[i])) + label->clear(); + m_metaDataFields[i]->setDisabled(true); + m_metaDataLabels[i]->setDisabled(true); + } + + for (auto &key : metaData.keys()) { + int i = int(key); + if (key == QMediaMetaData::CoverArtImage) { + if (QLabel *cover = qobject_cast<QLabel*>(m_metaDataFields[key])) { + QImage coverImage = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>(); + cover->setPixmap(QPixmap::fromImage(coverImage)); + } + } + else if (key == QMediaMetaData::ThumbnailImage) { + if (QLabel *thumbnail = qobject_cast<QLabel*>(m_metaDataFields[key])) { + QImage thumbnailImage = metaData.value(QMediaMetaData::CoverArtImage).value<QImage>(); + thumbnail->setPixmap(QPixmap::fromImage(thumbnailImage)); + } + } + else if (QLineEdit *field = qobject_cast<QLineEdit*>(m_metaDataFields[key])) + field->setText(QString("%1").arg(metaData.value(key).toString())); + m_metaDataFields[i]->setDisabled(false); + m_metaDataLabels[i]->setDisabled(false); } } @@ -487,3 +533,4 @@ void Player::clearHistogram() QMetaObject::invokeMethod(m_videoHistogram, "processFrame", Qt::QueuedConnection, Q_ARG(QVideoFrame, QVideoFrame())); QMetaObject::invokeMethod(m_audioHistogram, "processBuffer", Qt::QueuedConnection, Q_ARG(QAudioBuffer, QAudioBuffer())); } + diff --git a/examples/multimediawidgets/player/player.h b/examples/multimediawidgets/player/player.h index d95ad6191..3944d0f3f 100644 --- a/examples/multimediawidgets/player/player.h +++ b/examples/multimediawidgets/player/player.h @@ -54,6 +54,7 @@ #include <QWidget> #include <QMediaPlayer> #include <QMediaPlaylist> +#include <QMediaMetaData> QT_BEGIN_NAMESPACE class QAbstractItemView; @@ -119,7 +120,6 @@ private: QMediaPlayer *m_player = nullptr; QMediaPlaylist *m_playlist = nullptr; QVideoWidget *m_videoWidget = nullptr; - QLabel *m_coverLabel = nullptr; QSlider *m_slider = nullptr; QLabel *m_labelDuration = nullptr; QPushButton *m_fullScreenButton = nullptr; @@ -138,6 +138,9 @@ private: QString m_trackInfo; QString m_statusInfo; qint64 m_duration; + + QWidget *m_metaDataFields[QMediaMetaData::NumMetaData] = {}; + QLabel *m_metaDataLabels[QMediaMetaData::NumMetaData] = {}; }; #endif // PLAYER_H diff --git a/src/multimedia/qmediametadata.cpp b/src/multimedia/qmediametadata.cpp index 5ab262357..11002d96f 100644 --- a/src/multimedia/qmediametadata.cpp +++ b/src/multimedia/qmediametadata.cpp @@ -39,6 +39,7 @@ #include "qmediametadata.h" #include <qvariant.h> +#include <qobject.h> QT_BEGIN_NAMESPACE @@ -232,5 +233,65 @@ void QMediaMetaData::insert(QMediaMetaData::Key k, const QVariant &value) data.insert(k, value); } +QString QMediaMetaData::metaDataKeyToString(QMediaMetaData::Key k) +{ + switch (k) { + case QMediaMetaData::Title: + return (QObject::tr("Title")); + case QMediaMetaData::Author: + return (QObject::tr("Author")); + case QMediaMetaData::Comment: + return (QObject::tr("Comment")); + case QMediaMetaData::Description: + return (QObject::tr("Description")); + case QMediaMetaData::Genre: + return (QObject::tr("Genre")); + case QMediaMetaData::Year: + return (QObject::tr("Year")); + case QMediaMetaData::Date: + return (QObject::tr("Date")); + case QMediaMetaData::Language: + return (QObject::tr("Language")); + case QMediaMetaData::Publisher: + return (QObject::tr("Publisher")); + case QMediaMetaData::Copyright: + return (QObject::tr("Copyright")); + case QMediaMetaData::Url: + return (QObject::tr("Url")); + case QMediaMetaData::Duration: + return (QObject::tr("Duration")); + case QMediaMetaData::MediaType: + return (QObject::tr("Media type")); + case QMediaMetaData::AudioBitRate: + return (QObject::tr("Audio bit rate")); + case QMediaMetaData::AudioCodec: + return (QObject::tr("Audio codec")); + case QMediaMetaData::VideoBitRate: + return (QObject::tr("Video bit rate")); + case QMediaMetaData::VideoCodec: + return (QObject::tr("Video codec")); + case QMediaMetaData::AlbumTitle: + return (QObject::tr("Album title")); + case QMediaMetaData::AlbumArtist: + return (QObject::tr("Album artist")); + case QMediaMetaData::ContributingArtist: + return (QObject::tr("Contributing artist")); + case QMediaMetaData::TrackNumber: + return (QObject::tr("Track number")); + case QMediaMetaData::Composer: + return (QObject::tr("Composer")); + case QMediaMetaData::ThumbnailImage: + return (QObject::tr("Thumbnail image")); + case QMediaMetaData::CoverArtImage: + return (QObject::tr("Cover art image")); + case QMediaMetaData::Orientation: + return (QObject::tr("Orientation")); + case QMediaMetaData::Resolution: + return (QObject::tr("Resolution")); + case QMediaMetaData::LeadPerformer: + return (QObject::tr("Lead performer")); + } +} + QT_END_NAMESPACE diff --git a/src/multimedia/qmediametadata.h b/src/multimedia/qmediametadata.h index 0bf43309b..3e552aba8 100644 --- a/src/multimedia/qmediametadata.h +++ b/src/multimedia/qmediametadata.h @@ -89,6 +89,8 @@ public: LeadPerformer, }; + static const int NumMetaData = 27; + // QMetaType typeForKey(Key k); QVariant value(Key k) const; void insert(Key k, const QVariant &value); @@ -100,6 +102,8 @@ public: bool isEmpty() const { return data.isEmpty(); } + static QString metaDataKeyToString(Key k); + protected: friend bool operator==(const QMediaMetaData &a, const QMediaMetaData &b) { return a.data == b.data; } |