【问题标题】:Is there a way in Qt to force QMediaPlayer to buffer a file without playing it?Qt 中有没有办法强制 QMediaPlayer 缓冲文件而不播放它?
【发布时间】:2015-02-15 12:44:25
【问题描述】:

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

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

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

谢谢

【问题讨论】:

标签: qt qmediaplayer


【解决方案1】:

在您使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2014-12-01
    • 2011-01-27
    • 2020-08-07
    • 1970-01-01
    • 2015-01-22
    相关资源
    最近更新 更多