[英]QMediaPlayer - play a sound loaded into memory
情況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
類的真實聲音的file.txt
。 在第一種情況下,播放器立即停止。 在第二種情況下,播放器就保持在狀態PlayingState
( QMediaPlayer::BufferedMedia
, QMediaPlayer::NoError
)
說明文件:
QMediaPlayer :: setMedia(const QMediaContent&media,QIODevice * stream = Q_NULLPTR)
設置當前媒體源。
如果提供了流; 將從中讀取媒體數據,而不是解析媒體源。 在這種情況下,媒體源仍可用於解析有關媒體的其他信息,例如mime類型。 流必須是開放且可讀的。
將媒體設置為空的QMediaContent將導致播放器丟棄與當前媒體源有關的所有信息,並停止與該媒體有關的所有I / O操作。
因此,如果我使用media->setMedia(QMediaContent(), buffer);
然后,由於QMediaContent為空,媒體播放器將從內存中讀取數據,而沒有其他信息作為mime類型。 也許由於缺少mime類型,mediaplayer仍保留在PlayingState中,試圖播放內存中加載的文本文件。
因此,我嘗試將有效的QMediaContent與加載的數據結合使用...相同的結果:mediaplayer保留在PlayingState中,沒有任何錯誤。 media->setMedia(QMediaContent(QUrl::fromLocalFile(QFileInfo(s).absoluteFilePath())), buffer);
如何使用QMediaPlayer播放加載到內存中的聲音來避免此問題?
我知道這是一個舊線程,但是我遇到了同樣的問題,並找到了一種通過設置wav標頭來變通的方法,如下所示:
QMediaPlayer player;
QBuffer* buffer = new QBuffer();
buffer->open(QIODevice::ReadWrite);
buffer->seek(0);
qint8 RIFF[4]; // RIFF Header Magic header
qint32 wavfilesize;
qint8 WAVE[4]; // WAVE Header
qint8 fmt[4]; // FMT header
qint32 ChunkSize; // RIFF Chunk Size (length of above = 16)
qint16 AudioFormat; // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
qint16 NCh; // Number of channels 1=Mono 2=Sterio
qint32 SamplesPerSec; // Sampling Frequency in Hz
qint32 bytesPerSec; // bytes per second
qint16 blockAlign; // 2=16-bit mono, 4=16-bit stereo
qint16 bitsPerSample; // Number of bits per sample
qint8 Subchunk2ID[4]; // "data" string
qint32 Subchunk2Size; // Sampled data length
QVector<qint16> wavDataL;
QVector<qint16> wavDataR;
QDataStream out(buffer);
out.setVersion(QDataStream::Qt_4_8);
out.setByteOrder(QDataStream::LittleEndian);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);
out << RIFF[0] << RIFF[1] << RIFF[2] << RIFF[3]; //4
out << wavfilesize; // 4
out << WAVE[0] << WAVE[1] << WAVE[2] << WAVE[3]; // 4
out << fmt[0] << fmt[1] << fmt[2] << fmt[3]; // 4
out << ChunkSize; // 4
out << AudioFormat ; // 2
out << NCh; // 2
out << SamplesPerSec; // 4
out << bytesPerSec; // 4
out << blockAlign ; // 2
out << bitsPerSample; // 2
out << Subchunk2ID[0] << Subchunk2ID[1] << Subchunk2ID[2] << Subchunk2ID[3]; // 4
out << Subchunk2Size; // 4
if (NCh == 1){
for(int ii=0; ii<wavDataL.size(); ii++){
out << wavDataL[ii]; // 2
}
} else if (NCh == 2){
for(int ii=0; ii<wavDataL.size(); ii++){
out << wavDataL[ii];
out << wavDataR[ii];
}
}
buffer->seek(0);
player.setMedia(QMediaContent(), buffer);
player.play(); // though I actually played after the media is loaded QObject::connect(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(playClicked()));
我希望這對某些讀者有所幫助。
static QMediaPlayer player;
player.setMedia(QUrl::fromLocalFile("sound.mp3"));
player.play();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.