[英]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()
之后查詢QMediaPlayer
的duration()
可能不起作用,因為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.