QMediaPlayer duration()始终返回0

时间:2017-04-01 12:32:15

标签: c++ qt

我使用Qt 5.7 我正在写音乐播放器,但有一个问题。 duration()的方法QMediaPlayer始终返回0.我该如何解决?

代码示例:

QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QMediaContent(QUrl(path)));
qDebug() << player->duration(); // returns 0
player->play(); // it works

1 个答案:

答案 0 :(得分:1)

您无法在player->duration()之后立即player->setMedia(QMediaContent(QUrl(path)));

事实上,QMediaPlayer::setMedia 异步,所以如果您在其之后立即调用持续时间,则媒体将无法设置,然后持续时间将会出错。

来自Qt documentation on setMedia

  

注意:此功能在录制指定的媒体源后立即返回。它不会等待媒体完成加载,也不会检查错误。

更新持续时间后,QMediaPlayer会发送名为durationChanged(qint64 duration)的信号。因此,您需要做的是将此信号与lambda或slot连接。

例如,

QMediaPlayer *player = new QMediaPlayer(this);
connect(player, &QMediaPlayer::durationChanged, this, [&](qint64 dur) {
    qDebug() << "duration = " << dur;
});
QUrl file = QUrl::fromLocalFile(QFileDialog::getOpenFileName(this, tr("Open Music"), "", tr("")));
if (file.url() == "")
    return ;
player->setMedia(file);
qDebug() << player->duration();
player->setVolume(50);
player->play();

第一个 qDebug会写0 作为你的,但lambda中的第二个将写下QMediaPlayer的新持续时间