为什么qmediaplayer :: duration()给我-1的值

Why is QMediaPlayer::duration() giving me a value of -1?

本文关键字:给我 的值 qmediaplayer duration 为什么      更新时间:2023-10-16

这是我的代码:

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()从文档中表现出异步的加载:

此功能在记录介质的指定源后立即返回。它不会等待媒体完成加载,也不会检查错误。聆听加载媒体以及加载期间发生错误时通知mediaStatusChanged()error()信号。

这意味着请查询QMediaPlayerduration()立即致电setMedia()可能无法正常工作,因为QMediaPlayer可能还没有加载媒体。

为了确保加载在调用duration()之前已经完成,您必须收听mediaStatusChanged()信号,并且仅在mediaStatus()返回QMediaPlayer::LoadedMedia时才获得duration()。这是一个最小示例:

#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.nnThat is: %2")
                          .arg(duration)
                          .arg(QDateTime::fromTime_t(duration/1000).toUTC()
                               .toString("hh:mm:ss")));
            label.show();
        }
    });
    return app.exec();
}