将文件加载到QMediaPlayer
实例时,它不会自动缓冲文件。在您使用MediaStatus
播放文件之前,NoMedia
仍为play()
,之后才会以BufferedMedia
结尾。我在文档中找不到任何方法来强制播放器缓冲文件而不播放它 - 有什么方法可以做到这一点吗?
现在我打算将它静音,播放文件,然后再次停止并取消静音,但这让我觉得很脏。当然有更好的方法来做到这一点?
顺便说一下,这是必要的,因为在文件缓冲之前我无法检索duration
,我需要duration
在曲目中选择position
开始玩。
由于
答案 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);