如何访问QMediaPlayer的元数据?

时间:2018-10-29 20:18:04

标签: c++ qt

我想访问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 个答案:

答案 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());
    }
});