c++ - 为什么 QMediaPlayer::duration() 给我的值为 -1?

标签 c++ qt audio qmediaplayer vorbis

这是我的代码:

QString BoatProgramming::setDuration(QString path)
{
    if (path.isNull()) { return ""; }
    QMediaPlayer mp;
    mp.setMedia(QUrl::fromLocalFile("/home/akiva/deleteme.ogg"));
    qDebug() << mp.duration(); // Outputting a value of -1

    m_Duration = QString::number(mp.duration());
    emit durationChanged();
    return m_Duration;
}

显然某处有错误,但除了检查文件名之外,我很遗憾地不知道问题是什么。难道只是不支持.ogg?我是在对象完全加载到内存之前调用函数吗?还是其他原因?

谢谢。

最佳答案

QMediaPlayer::setMedia()docs 执行异步加载:

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. Listen for the mediaStatusChanged() and error() signals to be notified when the media is loaded and when an error occurs during loading.

这意味着为 duration() 查询 QMediaPlayer立即调用 setMedia() 可能无法正常工作,因为 QMediaPlayer 可能尚未加载媒体。

为了保证在调用 duration() 之前加载完成,你必须监听 mediaStatusChanged() 信号,并获取 duration() 仅当 mediaStatus() 时返回 QMediaPlayer::LoadedMedia。这是一个最小的例子:

#include <QtWidgets>
#include <QtMultimedia>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QLabel label; //a label to display duration

    QString fileName = QFileDialog::getOpenFileName(nullptr, "Open Media File");

    QMediaPlayer mp;
    mp.setMedia(QUrl::fromLocalFile(fileName));
    QObject::connect(&mp, &QMediaPlayer::mediaStatusChanged,
                     [&](QMediaPlayer::MediaStatus status){
        if(status == QMediaPlayer::LoadedMedia) //when loading is finished
        {
            //show duration in a label
            qint64 duration= mp.duration();
            label.setText(QString("Duration: %1 ms.\n\nThat is: %2")
                          .arg(duration)
                          .arg(QDateTime::fromTime_t(duration/1000).toUTC()
                               .toString("hh:mm:ss")));
            label.show();
        }
    });

    return app.exec();
}

关于c++ - 为什么 QMediaPlayer::duration() 给我的值为 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896846/

相关文章:

java - 在 fragment 中播放声音

c++ - 覆盖所有类型的 operator<<

c++ - 无法在 VS 2010 中编译 Vcg 库

c++ - 链接后的最小可执行文件大小

c++ - Qt选择矩形位置

android - 增加扬声器电话的音量,超过限制的Android

c++ - 如何定义与使用 lambda 兼容的函数指针并将捕获作为回调

c++ - WritePrivateProfileString 没有在末尾添加属性

c++ - QImage 与 QThreads

java - 在java中将音频转换为字节数组后实际存储的是什么?