我想访问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());
添加了库和多媒体。
答案 0 :(得分:0)
在调用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());
}
});