簡體   English   中英

為什么QMediaPlayer :: duration()給我值-1?

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

這是我的代碼:

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執行異步加載:

錄制指定的媒體來源后,此函數立即返回。 它不等待媒體完成加載,也不檢查錯誤。 偵聽mediaStatusChanged()error()信號,以便在加載媒體時以及加載過程中發生錯誤時得到通知。

這意味着在立即調用setMedia() duration()之后查詢QMediaPlayerduration()可能不起作用,因為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.\n\nThat is: %2")
                          .arg(duration)
                          .arg(QDateTime::fromTime_t(duration/1000).toUTC()
                               .toString("hh:mm:ss")));
            label.show();
        }
    });

    return app.exec();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM