如何访问 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 的元数据?的主要内容,如果未能解决你的问题,请参考以下文章

QMediaPlayer - 如何从在线广播中获取元数据?

如何使用 Swift 在 healthkit 中访问锻炼的元数据

如何使用 Swift 通过 PHAsset 访问 UIImage 的元数据

如何在(:all)之前访问rspec中的元数据?

如何播放 amr 音频,QMediaPlayer 不支持?

8.2.1 QMediaPlayer类介绍与基本使用