这是我的代码:
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
?我在对象完全加载到内存之前调用该函数吗?还是别的什么?
感谢。
答案 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