QMediaPlayer :: metaData始终返回QVariant(无效)

时间:2017-04-12 19:12:40

标签: qt metadata qmediaplayer

我在MAC OS上使用Qt并尝试检索媒体的元数据。所以我采用了Qt的媒体播放器示例(Qt 5.8.0)并进行了一些修改:

而不是:

connect(controls, SIGNAL(play()), player, SLOT(play()));

我用过:

connect(controls, &PlayerControls::play, player,
        [this]{
    qDebug() << player->isMetaDataAvailable();
    qDebug() << player->metaData(QMediaMetaData::Size);
    player->play();
    qDebug() << player->isMetaDataAvailable();
    qDebug() << player->metaData(QMediaMetaData::Resolution);
});

结果是:

false
QVariant(Invalid)
false
QVariant(Invalid)

第一个问题:为什么即使在媒体开始播放后元数据也无法使用?

第二个问题:我在析构函数中添加了一些代码:

Player::~Player()
{
    qDebug() << player->isMetaDataAvailable();
    qDebug() << player->metaData(QMediaMetaData::Duration);
}

现在元数据可用,但没有返回数据:

true
QVariant(Invalid)

有人能帮帮我吗?

更新问题1:

而不是

connect(controls, SIGNAL(pause()), player, SLOT(pause()));

我用过:

connect(controls, &PlayerControls::pause, player,
        [this]{
    qDebug() << player->isMetaDataAvailable();
    qDebug() << player->metaData(QMediaMetaData::Resolution);
});

在播放约3-5秒后,元数据已经可用,但它也没有返回任何内容:

true
QVariant(Invalid)

2 个答案:

答案 0 :(得分:0)

这不是您问题的确切答案,但这可能会对您有所帮助。您可以使用此代码检查可用的元数据:

QMetaDataReaderControl *c = qobject_cast<QMetaDataReaderControl*>(player_->service()->requestControl(QMetaDataReaderControl_iid));
if(c) {
    connect(c, &QMetaDataReaderControl::metaDataAvailableChanged, [c](bool) {
        qDebug() << c->availableMetaData();
    });
}

答案 1 :(得分:0)

我不确定,但是我认为qDebug无法处理QVariant,您应该使用例如:

qDebug() << (player->metaData(QMediaMetaData::Title)).toString();