MediaStatus 保持 NoMedia 直到您使用 play() 播放文件
不在 Qt 5 中,这不是您无法知道“持续时间”并设置“位置”的原因。当您使用setMedia
它设置媒体时,不会等待媒体完成加载(并且不会检查错误)。加载媒体时会发出信号mediaStatusChanged()
,因此请收听该信号并error()
在媒体加载完成时通知信号。
connect(player, &QMediaPlayer::mediaStatusChanged, this, [=]() {
qDebug() << "Media Status:" << player->mediaStatus();
我需要持续时间来选择曲目中的位置以开始播放。
一旦媒体文件被加载并且在播放之前,您可以检查持续时间并且您可以将播放器设置到所需的位置,但是最好在持续时间从 0 更改为加载后媒体持续时间时执行此操作,因此连接到信号durationChanged()
:
connect(player, &QMediaPlayer::durationChanged, this, [&](qint64 duration) {
qDebug() << "Media duration = " << duration;
player->setPosition(duration/2);
qDebug() << "Set position:" << player->position();
});
我在文档中找不到任何方法来强制播放器在不播放文件的情况下缓冲文件 - 有没有办法做到这一点?
是的,从文件创建一个缓冲区,然后将 mediacontent 设置为您的缓冲区(但这不是执行上述操作所必需的,它只是提供了一种更快的在媒体中查找的方法):
QString fileName=QFileDialog::getOpenFileName(this,"Select:","","( *.mp3)");
QFile mediafile(fileName);
mediafile.open(QIODevice::ReadOnly);
QByteArray *ba = new QByteArray();
ba->append(mediafile.readAll());
QBuffer *buffer = new QBuffer(ba);
buffer->open(QIODevice::ReadOnly);
buffer->reset(); //seek 0
player->setMedia(QMediaContent(), buffer);