我使用 Qt 5.7
我正在编写音乐播放器,遇到一个问题。 QMediaPlayer
的方法 duration()
始终返回 0。我该如何解决?
代码示例:
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QMediaContent(QUrl(path)));
qDebug() << player->duration(); // returns 0
player->play(); // it works
最佳答案
您不能在 player->setMedia(QMediaContent(QUrl(path)));
之后立即执行 player->duration()
。
事实上,QMediaPlayer::setMedia
是异步,所以如果您在它之后立即调用持续时间,媒体还没有设置,那么持续时间将是错了。
来自 Qt documentation on setMedia :
Note: This function returns immediately after recording the specified source of the media. It does not wait for the media to finish loading and does not check for errors.
当持续时间更新时,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 的新持续时间。
关于c++ - QMediaPlayer duration() 总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43156906/