您不能player->setMedia(QMediaContent(QUrl(path)));
後立即做了player->duration()
。
事實上,QMediaPlayer::setMedia
是異步所以如果你後馬上打電話期間,媒體將還沒有加入,然後持續時間將是錯誤的。
從Qt documentation on setMedia:
注:此功能記錄指定的媒體源後立即返回。它不會等待媒體完成加載,也不會檢查錯誤。
當持續時間更新時,QMediaPlayer發送一個名爲durationChanged(qint64 duration)
的信號。所以你需要做的是將這個信號連接到一個lambda或一個插槽。
例如,
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的新的持續時間。
請編輯您的問題以包含[mcve](https://stackoverflow.com/help/mcve)。另請注意,根據[文檔](http://doc.qt.io/qt-5/qmediaplayer.html#duration-prop),「初始播放開始時可能無法使用」持續時間。 –