案例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
那样真实。
在第一种情况下,玩家立即停止。
在第二种情况下,玩家保持状态PlayingState
(QMediaPlayer::BufferedMedia
,QMediaPlayer::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播放加载到内存中的声音,避免此问题?
答案 0 :(得分:0)
我知道这是一个旧线程,但是我遇到了相同的问题,并找到了一种方法来解决该问题,方法是设置一个wav标头,如下所示:
COUNT
我希望这对某些读者有所帮助。
答案 1 :(得分:-2)
static QMediaPlayer player;
player.setMedia(QUrl::fromLocalFile("sound.mp3"));
player.play();