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

时间:2016-11-30 19:43:27

标签: 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?我在对象完全加载到内存之前调用该函数吗?还是别的什么?

感谢。

1 个答案:

答案 0 :(得分:1)

QMediaPlayer::setMedia()docs

异步执行加载
  

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

这意味着在立即调用QMediaPlayer后查询setMedia() QMediaPlayer可能无效,因为duration()可能尚未加载媒体。

为了确保在致电mediaStatusChanged()之前加载已完成,您必须收听duration()信号,并仅在duration()返回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(); } }。这是一个最小的例子:

LDR      Ra, [Rb,#2]          ; Get halfword to bits 15:0
MOV      Ra,Ra,LSL #16        ; move to top
MOV      Ra,Ra,LSR #16        ; and back to bottom
                              ; use ASR to get sign extended version