2017-04-12 33 views
0

我在MAC OS上使用Qt并尝试检索媒体的元数据。所以我采取了Qt的媒体播放器实例(QT 5.8.0)和改性一点点:QMediaPlayer :: metaData总是返回QVariant(无效)

相反的:

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) 

第一个问题:为什么元数据不可用,即使在med ia开始玩?

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

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

你应该使用'metaDataAvailableChanged(布尔可用)'信号 – Evgeny

+0

的问题是:当'isMetaDataAvailable()==真',让'metaData'仍然会返回一个' QVariant(无效)',我如何检索媒体的元数据? – scmg

回答

0

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

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