Как получить доступ к метаданным QMediaPlayer? - PullRequest
0 голосов
/ 29 октября 2018

Я хочу получить доступ к метаданным файла 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 голосов
/ 30 октября 2018

Причина

Требуется время для загрузки носителя после вызова 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());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...