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