如何访问 QMediaPlayer 的元数据?
Posted
技术标签:
【中文标题】如何访问 QMediaPlayer 的元数据?【英文标题】:How to access the meta data of QMediaPlayer? 【发布时间】:2018-10-29 20:18:04 【问题描述】:我想访问 mp3 文件的元数据并将其放在标签中,但程序不读取它。 我读了http://doc.qt.io/qt-5/qmediametadata.html。 我写了这段代码,但它不能正常工作(除了 QFileInfo)。
path = item->text(); //text is a path from QFileDialog::getOpenFileName
/*QMediaPlayer*/ sound.setMedia(QUrl::fromLocalFile(path));
QFileInfo info(path);
ui->label_3->setText(sound.metaData("Title").toString());
if (ui->label_3->text()=="")
ui->label_3->setText(sound.metaData("AlbumTitle").toString());
if (ui->label_3->text()=="")
ui->label_3->setText(info.baseName());
ui->label_5->setText(sound.metaData("Author").toString());
if (ui->label_5->text()=="")
ui->label_5->setText(sound.metaData("AlbumArtist").toString());
if (ui->label_5->text()=="")
ui->label_5->setText(sound.metaData("Composer").toString());
添加了图书馆和多媒体。
【问题讨论】:
【参考方案1】:原因
调用QMediaPlayer::setMedia
后加载媒体需要一些时间,因此在设置媒体后立即请求元数据会导致:
QVariant(Invalid)
解决方案
我建议您通过连接到QMediaPlayer::mediaStatusChanged
并在状态变为QMediaPlayer::LoadedMedia
时读取元数据来等待媒体加载。
注意:如果您将sound
设为局部变量,它会在超出范围时被销毁。最好使用auto *sound = new QMediaPlayer(this);
。
示例
这是我为您准备的示例,说明如何更改代码以实施建议的解决方案:
connect(sound, &QMediaPlayer::mediaStatusChanged, [this, sound, info](QMediaPlayer::MediaStatus status)
if (status == QMediaPlayer::LoadedMedia)
ui->label_3->setText(sound->metaData("Title").toString());
if (ui->label_3->text()=="")
ui->label_3->setText(sound->metaData("AlbumTitle").toString());
if (ui->label_3->text()=="")
ui->label_3->setText(info.baseName());
ui->label_5->setText(sound->metaData("Author").toString());
if (ui->label_5->text()=="")
ui->label_5->setText(sound->metaData("AlbumArtist").toString());
if (ui->label_5->text()=="")
ui->label_5->setText(sound->metaData("Composer").toString());
);
【讨论】:
感谢您的建议,但我收到消息:“捕获列表中的‘声音’没有命名变量。”。我将声音作为 QMediaPlayer 变量存储在 mainwindow.h 文件中。我应该将它存储在其他地方以使其正常工作吗? @Nve,将[this, sound, info]
更改为[this, info]
。
我还在声音 (&sound) 中添加了 &,现在它可以正常工作了,谢谢。以上是关于如何访问 QMediaPlayer 的元数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swift 在 healthkit 中访问锻炼的元数据