9

当您将文件加载到QMediaPlayer实例中时,它不会自动缓冲文件。在您使用 播放文件之前MediaStatus仍然存在,只有在此之后它才会以. 我在文档中找不到任何方法来强制播放器在不播放文件的情况下缓冲文件 - 有没有办法做到这一点?NoMediaplay()BufferedMedia

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

duration顺便说一句,这是必要的,因为在文件缓冲之前我无法检索,并且我需要在轨道中duration选择 aposition以开始播放。

谢谢

4

1 回答 1

2

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);
于 2018-04-16T19:24:44.670 回答