我使用Qt 5.7
我正在写音乐播放器,但有一个问题。 duration()
的方法QMediaPlayer
始终返回0.我该如何解决?
代码示例:
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QMediaContent(QUrl(path)));
qDebug() << player->duration(); // returns 0
player->play(); // it works
答案 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的新持续时间。