QMediaPlayer - 播放加载到内存中的声音

时间:2017-02-10 20:38:38

标签: c++ qt qmediaplayer

案例1。我设法用QMediaPlayer播放声音:

QMediaPlayer* media = new QMediaPlayer();
media->setMedia("sound.mp3");
media->play();

案例2。如果我将声音加载到内存并像这样播放,一切都还可以:

QFile file("sound.mp3");
file.open(QIODevice::ReadOnly);
QByteArray* arr = new QByteArray(file.readAll());
file.close();
QBuffer* buffer = new QBuffer(arr);
buffer->open(QIODevice::ReadOnly);
buffer->seek(0);
QMediaPlayer* media = new QMediaPlayer();
media->setMedia(QMediaContent(), buffer);
media->play();

问题是指我尝试播放的文件不像file.txt那样真实。 在第一种情况下,玩家立即停止。 在第二种情况下,玩家保持状态PlayingStateQMediaPlayer::BufferedMediaQMediaPlayer::NoError

文档

  

void QMediaPlayer :: setMedia(const QMediaContent& media,QIODevice   * stream = Q_NULLPTR)

     

设置当前媒体源。

     

如果提供了流;将从中读取媒体数据而不是   解决媒体来源。在这种情况下,媒体源可能仍然是   用于解决有关媒体的其他信息,如mime   类型。流必须是开放的,可读的。

     

将媒体设置为空QMediaContent将导致播放器   丢弃与当前媒体源有关的所有信息   停止与该媒体相关的所有I / O操作。

因此,如果我使用media->setMedia(QMediaContent(), buffer);,那么媒体播放器将从内存中读取数据,而不会出现mime类型的其他信息,因为QMediaContent为空。也许mediaplayer因为缺少mime类型而仍然在PlayingState中,试图播放加载到内存中的文本文件。

所以我尝试将有效的QMediaContent与加载的数据结合使用......结果相同:mediaplayer保留在PlayingState中,没有任何错误。 media->setMedia(QMediaContent(QUrl::fromLocalFile(QFileInfo(s).absoluteFilePath())), buffer);

如何使用QMediaPlayer播放加载到内存中的声音,避免此问题?

2 个答案:

答案 0 :(得分:0)

我知道这是一个旧线程,但是我遇到了相同的问题,并找到了一种方法来解决该问题,方法是设置一个wav标头,如下所示:

COUNT

我希望这对某些读者有所帮助。

答案 1 :(得分:-2)

static QMediaPlayer player;
player.setMedia(QUrl::fromLocalFile("sound.mp3"));
player.play();