有没有办法在Qt中强制QMediaPlayer缓存文件而不播放它?

时间:2014-12-17 02:56:36

标签: qt qmediaplayer

将文件加载到QMediaPlayer实例时,它不会自动缓冲文件。在您使用MediaStatus播放文件之前,NoMedia仍为play(),之后才会以BufferedMedia结尾。我在文档中找不到任何方法来强制播放器缓冲文件而不播放它 - 有什么方法可以做到这一点吗?

现在我打算将它静音,播放文件,然后再次停止并取消静音,但这让我觉得很脏。当然有更好的方法来做到这一点?

顺便说一下,这是必要的,因为在文件缓冲之前我无法检索duration,我需要duration在曲目中选择position开始玩。

由于

1 个答案:

答案 0 :(得分:0)

  

在您使用play()

播放文件之前,MediaStatus仍为NoMedia

不在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);