2017-02-10 103 views
0

案例1.我设法播放声音与QMediaPlayer这样的:QMediaPlayer - 玩加载到内存中的声音

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

案例2.如果我加载声音到内存一切都OK还并发挥它是这样的:

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

文档:

空隙QMediaPlayer :: setMedia(常量QMediaContent &媒体,QIODevice中 *流= Q_NULLPTR)

设置当前媒体源。

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

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

所以,如果我用media->setMedia(QMediaContent(), buffer);然后媒体播放器会从内存中读取数据,而不作为,因为空QMediaContent的MIME类型的附加信息。也许mediaplayer由于缺少mime类型而保留在PlayingState中,试图播放加载到内存中的文本文件。

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

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

回答

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

你能解释一下为什么该代码是解决问题的办法? – eyllanesc

+0

尽管此代码片段可能是解决方案,但其中的解释确实有助于提高帖子的质量。请记住,你所回答的问题,在未来的读者,而那些人可能不知道的原因,你的代码的建议 –

+0

在我有限的经验,它可以播放的文件,如果你玩的d盘下的文件,可以更换它与“D:\\ sound。Mp3” – tom