【问题标题】:How to access the meta data of QMediaPlayer?如何访问 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());

添加了图书馆和多媒体。

【问题讨论】:

    标签: c++ qt


    【解决方案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) 中添加了 &,现在它可以正常工作了,谢谢。
    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多