c++ - QMediaPlayer duration() 总是返回 0

标签 c++ qt

我使用 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/

相关文章:

c++ - 从读取之前关闭的文件中读取

c++ - Berkeley DB 无法使用不同的 Dbt 初始化设置值

c++ - 如何减小 qtgui4.dll 的大小?

qt - QGraphicsItem 交互式调整大小

c++ - 错误 : C1083: Cannot open include file: 'QJson/Parser' : No such file or directory

c++ - Qt C++ - 对 ... 内联 QImage 自定义函数的 undefined reference

c++ - 初始化 vector 的高效而优雅的方法

c++ - 当我们说操作系统的控制在程序执行时传递给 main() 函数时,我们是什么意思?

C++ std::thread 无效使用 void 表达式

c++ - 从鼠标左键单击 QTableView 获取行和列?