0

我在 MAC OS 上使用 Qt 并尝试检索媒体的元数据。所以我拿了 Qt's Media Player Example (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)
4

2 回答 2

0

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

QMetaDataReaderControl *c = qobject_cast<QMetaDataReaderControl*>(player_->service()->requestControl(QMetaDataReaderControl_iid));
if(c) {
    connect(c, &QMetaDataReaderControl::metaDataAvailableChanged, [c](bool) {
        qDebug() << c->availableMetaData();
    });
}
于 2017-04-16T16:45:19.147 回答
0

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

qDebug() << (player->metaData(QMediaMetaData::Title)).toString();
于 2019-02-14T08:18:48.163 回答