【问题标题】:QMediaPlayer::metaData always returns QVariant(Invalid)QMediaPlayer::metaData 总是返回 QVariant(Invalid)
【发布时间】:2017-04-12 19:12:39
【问题描述】:

我在 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)

【问题讨论】:

  • 你应该使用metaDataAvailableChanged(bool available)信号
  • 问题是:虽然isMetaDataAvailable() == true,获取metaData 仍然返回QVariant(Invalid),我如何检索媒体的元数据?

标签: qt metadata qmediaplayer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 2016-10-10
      • 2012-07-29
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多