2017-02-10 156 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